我已经制作了旧风险棋盘游戏的一个版本。当军队互相攻击时,我用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!
对于上述 4 对 1 攻击,我已经尝试分批运行 20,000 次我的攻击方法,并且攻击者赢得了 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
所以是的,我不确定我能告诉用户什么,除了可能会发生不安。