Random vs SecureRandom在游戏中

问题描述:

我制作了旧版风险棋盘游戏。我使用java.util.Random来实施军队互相攻击时的掷骰。例如,当3名军队攻击领土两军,我一定要“滚” 5模具总数:Random vs SecureRandom在游戏中

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  

所以是啊不知道我可以告诉用户除了可能会发生翻倒。

+0

然后,如何根据所有这些卷来决定获胜者?也许这是一个逻辑缺陷。 – 2012-04-24 16:55:59

+5

你的逻辑似乎比“随机”不是“足够随机”更有问题。 – 2012-04-24 16:59:37

100(最少总卷数100)的军队怎么能输给2队(最大总卷12)?事实上,你确定你的逻辑是正确的吗?

FWIW您发布的代码片段看起来不错,我无法想象Random在发行版中的微小缺陷会带来可衡量的差异。

+0

也许我误解了规则 - 让我们简化为100 vs 1场景。我认为攻击者可以掷出的最大死亡数是3,而后卫是2.在100 vs 1的战斗中,如果每次攻击时都能掷出6,那么防御者可以完全击败攻击者? – user291701 2012-04-24 18:03:51

+0

为什么我讨厌游戏的“风险”:即使在100比1的情况下,规则说攻击的军队最多可以掷出3个骰子,而不是100个骰子。每个军队最多可以有1个死亡,最多为3个。 – 2012-04-24 18:19:24

+0

@Stephen,在风险中,如果攻击者有3个军队,他可以掷出的骰子的最大数量是2. – GriffeyDog 2012-04-24 18:49:17