我知道这是一个在某种程度上已经讨论过的讨论,但我对非常大的样本量特别感兴趣。在我下面的程序中,我迭代了大约一万亿次(我已经做了越来越多),结果对于伪随机而言似乎并不是真正随机的甚至是足够好的。我试图让论坛非常通用。如果我需要返回并将我的实际程序和结果放完,我可以。我应该使用不同的方式获得一个比我下面的随机数?
for (int i = 0; i < 1000000000; i++) {
OB1 ob1= ob1List.get(new Random().nextInt(ob1List.size()));
OB2 ob21= ob2List.get(new Random().nextInt(ob2List.size()));
OB2 ob22= ob2List.get(new Random().nextInt(ob2List.size()));
OB3 ob31= ob3List.get(new Random().nextInt(ob3List.size()));
OB3 ob32= ob3List.get(new Random().nextInt(ob3List.size()));
OB3 ob33= ob3List.get(new Random().nextInt(ob3List.size()));
}
每个ArrayList包含50-100个对象。 ob21和ob22在每次迭代时从同一列表中选择,ob31,ob32和ob33在每次迭代时从同一列表中选择。
虽然在分解结果时,我注意到特定对象往往更多地出现在特定变量中,而不是同一对象类型的另一个变量。例如,来自ob2List的单元格0似乎只出现在ob22中,但几乎从不出现在ob21中。每个单元格和每个列表都会发生同样的情况。 ob3List(或任何列表)中的单元格0应该有一个同等随机的机会出现在ob31,ob32或ob33中。某些细胞几乎总是在相同的位置显示。
我的结果似乎有点随意,但在我看到的内容中有太多巧合。我认为我没有正确使用随机类,或者在数百万或数十亿次迭代后随机性发生故障。
答案 0 :(得分:3)
出于性能和随机性原因,请勿一直使用new Random()
。使用单个Random
实例声明变量并重复调用方法。
答案 1 :(得分:1)
您还可以使用SecureRandom获得更好的随机结果;
SecureRandom secureRandom = new SecureRandom();
OB1 ob1 = null;
OB2 ob21, ob22 = null;
OB3 ob31, ob32, ob33 = null;
int ob1ListSize = ob1List.size();
int ob2ListSize = ob2List.size();
int ob3ListSize = ob3List.size();
for (int i = 0; i < 1000000000; i++) {
ob1= ob1List.get(secureRandom.nextInt(ob1ListSize));
ob21= ob2List.get(secureRandom.nextInt(ob2ListSize));
ob22= ob2List.get(secureRandom.nextInt(ob2ListSize));
ob31= ob3List.get(secureRandom.nextInt(ob3ListSize));
ob32= ob3List.get(secureRandom.nextInt(ob3ListSize));
ob33= ob3List.get(secureRandom.nextInt(ob3ListSize));
}
您应该为变量分配列表大小值,然后您应该在循环中使用它们而不是获得数百万次的大小。