返回两个整数之间的随机数 - 总是相同的值

时间:2014-03-11 21:43:39

标签: java random

/**
 * @return random damage from monster
 * @param monster of class Monster
 */
public int getRandomDamage(Monster monster) {
    int min = monster.getMinDamage(); //this is set to 20 for monsters
    int max = monster.getMaxDamage(); //this is set to 30 for monsters

    return randomGenerator.nextInt(max - min + 1) + min;
}

此返回语句不起作用,因为它总是返回整数20.任何解决的提示,它应该返回20(int min)和30(int max)之间的随机数。感谢任何帮助。

经过一些问题解决,结果发现getMaxDamage();返回20而不是30,现在运行良好,你输入错误是愚蠢的。

2 个答案:

答案 0 :(得分:4)

发布的代码 a valid and accepted approach(但是,请重复使用相同的PRNG ..)。

我能想到的行为最合理的解释是,值预期的内容。例如,以下将始终产生20。

int min = 20;
int max = 20;
return randomGenerator.nextInt(max - min + 1) + min;

替换值会产生nextInt(1) + 20,其中nextInt(1)始终返回0,因为Random.nextInt(n)会返回[0,n)范围内的整数。


其他一些原因......(调试是关于开发和测试假设)

也许,randomGenerator 不是 Random并且是just broken

class FairRandom {
    public int nextInt(int n) {
        return 0; /* chosen by fair dice roll */ }
    }
}

或许,正确生成随机数 ,而“始终为20”的值来自其他地方。

或者,也许,在每次调用nextInt之前,随机数生成器正在重新种子,并且你非常不幸种子导致20被“随机”选择。

或者,或许,你正在听@JasonC并且用我所有的假设来肆虐; - )

答案 1 :(得分:1)

您的随机数生成代码没问题。

您所看到的最合理的解释是getMaxDamage()实际上返回的是20而不是30。

我建议添加一些临时打印输出来检查这些值,或者在调试器中运行它,以及检查getMaxDamage()代码是否有错误。

其他解释包括非常不幸的中微子/宇宙射线的存在导致CPU寄存器中的位翻转,这恰好导致每次计算20次,或者也许是Intergalactic Council of Zero Entropy认为您的行为具有过高的风险揭示了随机数的有用性,并用记忆看到20来帮助他们在整个宇宙中传播反随机宣传的更大目标,从而覆盖了调试软件的记忆。