Random.nextInt返回连续的相同值整数(经常)

时间:2017-10-01 08:20:10

标签: java scala random statistics

我在运行scala.util.Random().nextInt(3) 81次时会看到如下所示的结果(Java开发人员,请参阅edit了解其相关性):

200010202002112102222211012021020111220022001021101222222022210222220100000100010

注意大的连续块: 000222221112222222222222200000000

直观地说,序列似乎不是自然的/“真实世界的硬币翻转”随机。

例如,要实现6x连续2 s只有0.4%次机会(AFAIK),并且对于5x连续值,则有1.2%次机会。Random.nextInt(exclusiveMax) ..所以我不太可能继续在输出中看到这样的模式。

这会在现实世界中用3面硬币发生吗?或者,当使用Java的scala.util.Random.nextInt(int)方法时,这是否是与“真随机”的预期偏差?

修改

我实际上一直在使用java.util.Random,它会通过new java.util.Random()创建一个新的全局{{1}}。

1 个答案:

答案 0 :(得分:3)

这不是一个笑话:我会在现实世界中尝试它(可能最容易用两个硬币:两个头= 0,混合= 1,两个尾巴= 2)。我怀疑你会看到相同的结果。

你只有三个值,所以一个2的概率总是1:3。你是对的,有了2,你连续两次获得5次的几率约为0.04%,这在81卷中确实不太可能。但是在得到2之后,你得到 4 的几率是(正如你所说的)1.23% - 更有可能,并且在81卷中并不奇怪。

我自己运行下面的程序,我经常在81卷批次中运行三个,经常运行四个,但很少运行五个,相当很少运行六个。所有这些都符合我的期望。

Measuring the randomness of a PRNG是一个非常复杂的话题。简单的措施是运行数百万次,然后看看你是否已经获得了每个值〜0.33333333%的时间。但当然,这可能是一百万0,然后是百万分之一,接着是一百万分,这将是一个可疑的随机结果。 :-)但是如果你想测试你的设置,你可以尝试维基百科文章中讨论的几种方法。或者订阅https://www.random.org/等真正随机性的来源。或者一个随机的USB设备(虽然我会对其中一个进行大量的尽职调查)。

我的节目:

import java.util.*;

public class E {

    public static void main(String[] args) {
        Random r = new Random();
        Map<Integer,Integer> runs = new TreeMap<>();
        int last = -1;
        int run = 0;
        for (int i = 0; i < 81; ++i) {
            int v = r.nextInt(3);
            if (v != last) {
                if (i != 0) {
                    if (runs.containsKey(run)) {
                        runs.put(run, runs.get(run) + 1);
                    } else {
                        runs.put(run, 1);
                    }
                    System.out.println(" (" + run + ")");
                }
                last = v;
                run = 0;
            }
            ++run;
            System.out.print(v);
        }
        System.out.println("\n****");
        for (Map.Entry e : runs.entrySet()) {
            System.out.println(e.getKey() + ": " + e.getValue());
        }
    }
}