Java的随机类行为澄清

时间:2016-10-27 10:31:57

标签: java random generator probability

我有一个类'A',它包含一个Random实例,它模拟滚动一个骰子,例如: 6个边,每个'卷'产生1 - 6的结果。

我有另一个类'B'可以保存对A类对象的引用,并且应该委托给它'roll'方法。

另一个人需要编写一个单元测试来评估B类中的方法是否正确地委托给A类中的'roll'方法。为了做到这一点,我只需要调用方法X次并检查分数是否更新。

目前在单元测试中,我有一个循环,最多可以循环1000次,如果分数没有更新,那么我认为它超出可能的范围,相同的数字可以连续滚动1000次!然而,我已经凭空挑选了1000号。我想根据Java的Random类的实际行为选择一个更准确的数字。

从阅读API开始,它表示它是“线性同余伪随机数发生器......”。我试图确定的是基于它使用48位,是否有多次不可能重复相同的值。例如。在我的情况下,可以生成数字1 - 6,是否说不可能获得相同的数字,例如6,连续20多次?如果有人知道,我正在寻找这些信息。

更新 - 我会让问题更简单。使用Java随机类,如果我调用nextInt(6),我可以连续多次接收相同的结果。例如。数学上是否存在基于随机类算法的48位种子和工作的限制?我想要一个答案,例如, “绝对不可能获得超过X次的相同结果”,其中X是我的答案。

2 个答案:

答案 0 :(得分:3)

通常你会试图模仿A类(即Mockito)。 Here是一个SO问题/答案,显示如何验证方法是否被调用n次。

答案 1 :(得分:1)

根据文档,Random使用的PRNG只有2个 48 个不同的状态。因此,使用nextInt(6)生成的数字序列以最多2 48 的周期重复。<​​/ p>

我们可以假设所有6种可能的结果最终都与种子值无关,否则,发生器的质量非常差。因此,必须存在极限X < 2 48 满足&#34;绝对不可能获得相同的结果超过X次&#34;。

要找到最小的这样的X然而不是微不足道的。蛮力方法会产生2个 48 成功的数字并检查。