游戏中随机vs SecureRandom

时间:2012-04-24 16:49:04

标签: java random

我已经制作了旧版风险棋盘游戏的版本。当军队互相攻击时,我正在使用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%赢率要低得多:

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      

所以,是的,我不知道我可以告诉用户除了可能发生的不满情绪。

1 个答案:

答案 0 :(得分:2)

一支100人(最小总数100)的军队如何输给2人的军队(最大总数为12)?确实,你确定你的逻辑是正确的更远吗?

FWIW你发布的片段看起来很好,我无法想象Random在发行版中的微小缺点会产生可衡量的差异。