Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
random().nextInt在样本量巨大的Java中有多随机?_Java_Random - Fatal编程技术网

random().nextInt在样本量巨大的Java中有多随机?

random().nextInt在样本量巨大的Java中有多随机?,java,random,Java,Random,我知道这在某种程度上是一个讨论,但我对非常大的样本量特别感兴趣。在我下面的程序中,我迭代了大约一万亿次(我做的越来越多,越来越少),结果似乎不是真正随机的,甚至还不足以用于伪随机。我试着让它在论坛上非常通用。如果我需要回去把我的实际计划和结果公布出来,我可以。我应该使用一种不同的方法来获得一个随机数,而不是下面的方法吗 for (int i = 0; i < 1000000000; i++) { OB1 ob1= ob1List.get(new Random().next

我知道这在某种程度上是一个讨论,但我对非常大的样本量特别感兴趣。在我下面的程序中,我迭代了大约一万亿次(我做的越来越多,越来越少),结果似乎不是真正随机的,甚至还不足以用于伪随机。我试着让它在论坛上非常通用。如果我需要回去把我的实际计划和结果公布出来,我可以。我应该使用一种不同的方法来获得一个随机数,而不是下面的方法吗

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()));
}
for(int i=0;i<100000000;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中的概率应相同。不过,某些细胞几乎总是显示在相同的点上


我的结果似乎是随机的,但我看到的只是太多的巧合。我想我不是没有正确使用Random类,就是经过数百万或数十亿次迭代后,随机性崩溃了。

不要一直使用
new Random()
,因为性能和随机性的原因。用一个
Random
实例声明一个变量,并重复调用该实例上的方法。

您也可以使用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));
    }
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();
对于(int i=0;i<100000000;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));
}

您应该将列表大小值分配给变量,然后在循环中使用它们,而不是获得数百万次的大小。

您错误地使用了Random类。您应该只创建一个
Random
实例,并将其用于对
nextInt
的所有调用。真正的随机性的问题是无法将其与“真正的随机”和“看起来很奇怪”区分开来。对于一万亿个项目,你可以肯定地期望值在所有可能性中相对均匀地分布,但是。。。这是随机的。随机你可以得到
42
1万亿次,但仍然是随机的,只是随机性不是很有用。