游戏中的Random与SecureRandom有何区别?

3

我制作了一个旧版风险游戏的版本。在部队攻击彼此时,我使用java.util.Random来实现骰子的掷出。例如,当3个军队攻击一个有两个军队的领土时,我必须总共“摇”5个骰子:

Attacker rolls: 3 die
Defender rolls: 2 die

int[] rollsAttacker = new int[3];
int[] rollsDefender = new int[2];

for (int i = 0; i < 3; i++) {
    rollsAttacker[i] = mRandom.nextInt(6) + 1;
}
for (int i = 0; i < 2; i++) {
    rollsDefender[i] = mRandom.nextInt(6) + 1;
}

// compare rolls and figure out who won...
// ...

我收到了异常高数量的关于存在太多“惊喜”的抱怨。例如,100人的军队可能会输给2人的军队。我已经运行我的掷骰子方法数百万次来测试胜负比例,并且它们与其他做同样事情的网站几乎完全匹配。
我考虑过转换为SecureRandom,这可能会更“随机”,但不知道是否值得。我不知道util.Random可能会出现什么状况以产生如此频繁的惊喜。用户可以在移动设备上玩,因此可能是util.Random的实现在某些平台上产生了较小的方差吗?(投诉似乎来自特定品牌的手机)。
总之,我不确定在我的情况下转换为SecureRandom是否有帮助,如果速度显着变慢,或者我只是没有正确使用util.Random。
----------- 更新 ----------------
以下是防守者总体获胜的4对1攻击示例。
Attacking 4 vs 1...
  Roll:
    a: 5, 5, 4
    d: 6
  Roll:
    a: 5, 2
    d: 5
  Roll:
    a: 3
    d: 5

Defender survived!

我已经尝试以20000次为一组运行攻击方法,针对上述的4 vs 1攻击,攻击者有91%的获胜率。这比维基百科页面上宣传的97%低得多:

odds from Wikipedia

太糟糕了。

------ 更新(再次) ------------

实际上,我不小心看错了图表,我的数字与图表相符。
0.4139    0.7502    0.9132    0.97245   0.99015   0.9964    0.9991    0.99975   0.9999    1.0       
0.10865   0.36105   0.649     0.78555   0.8924    0.9343    0.9691    0.98      0.9904    0.9951    
0.02655   0.2065    0.4729    0.6414    0.76725   0.8584    0.9121    0.94605   0.9687    0.982     
0.00665   0.0905    0.3182    0.48215   0.63985   0.7432    0.8304    0.8894    0.9274    0.9525    
0.0015    0.04775   0.20575   0.35955   0.50885   0.64125   0.7389    0.8168    0.8753    0.9164    
5.5E-4    0.0229    0.1323    0.25105   0.39385   0.52695   0.6436    0.7254    0.805     0.86415   
0.0       0.00975   0.0854    0.18075   0.29985   0.42645   0.5389    0.64695   0.72615   0.8009    
5.0E-5    0.00545   0.05515   0.1255    0.2228    0.3307    0.4438    0.54365   0.64505   0.723     
0.0       0.00255   0.03225   0.0877    0.16005   0.2576    0.3519    0.46685   0.559     0.6445    
0.0       0.00125   0.0201    0.0569    0.11595   0.19315   0.2898    0.374     0.47505   0.56275      

所以,我不确定我能告诉用户什么,除了可能会发生一些不愉快的事情。


然后根据所有的掷骰子结果如何决定胜者呢?也许这是一个逻辑漏洞。 - James Montagne
5
你的逻辑存在问题似乎更可能,而不是 Random 不够“随机”。 - Louis Wasserman
1个回答

2

一支军队总点数最少为100的情况下,怎么可能输给一支总点数最大为12的军队(由2人组成)?实际上,你确定后面的逻辑正确吗?

顺便说一下,你发布的片段看起来很好,我无法想象Random在分布方面的微小缺陷会产生可测量的差异。


也许我误解了规则 - 让我们简化为100对1的情况。我认为攻击者能够掷出的最大骰子点数是3,而防御者则是2。在100对1的战斗中,如果防御者每次攻击都掷出6点,那么他们完全可以打败攻击者? - user291701
为什么我讨厌“风险”游戏:规则规定,即使是100对1的情况下,进攻方也只能掷最多3个骰子,而不是100个。每个军队最多只能掷1个骰子,最多不超过3个。 - Stephen P
@Stephen,在风险游戏中,如果攻击者有3个军队,则他可以掷骰子的最大数量为2。 - GriffeyDog
啊,我懂了。我实际上查了规则:http://en.wikipedia.org/wiki/Risk_(game)#Attacking 是的,进攻者可以投掷最多3个骰子,防御者可以投掷最多2个骰子。这个页面很好地计算了概率,考虑到这一点,进攻者失败的情况并不罕见。所以也许不是你的代码有问题,而是误解规则(比如我)认为100对2的战斗几乎总是会赢得进攻者的胜利? - Sean Owen
好的,我已经更新了上面的问题,并添加了一些附加测试,感谢你的帮助。 - user291701
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接