我制作了一个旧版风险游戏的版本。在部队攻击彼此时,我使用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%低得多:
------ 更新(再次) ------------
实际上,我不小心看错了图表,我的数字与图表相符。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
所以,我不确定我能告诉用户什么,除了可能会发生一些不愉快的事情。
Random
不够“随机”。 - Louis Wasserman