当运行 scala.util.Random().nextInt(3)
81 次时,我看到如下结果(Java 开发人员,请参阅 edit
了解这之间的关系):
200010202002112102222211012021020111220022001021101222222022210222220100000100010
注意大的连续 block :
000
, 22222
, 111
, 222222
, 222
, 22222
,00000
,000
。
从直觉上看,这个序列看起来并不自然/“真实世界的抛硬币”是随机的。
例如,要实现 6x
连续 2
,只有 0.4%
的机会(据我所知),5x
连续值有 1.2%
的机会......所以我似乎不太可能在输出中继续看到这样的模式。
这会发生在现实世界中的 3 面硬币吗?或者这是在使用 Java 的 Random.nextInt(exclusiveMax)
方法时与“真正随机”的预期偏差?
编辑:
我实际上一直在使用 scala.util.Random.nextInt(int)
,它通过 new java 创建一个新的全局
.java.util.Random
.util.Random()
最佳答案
这不是玩笑:我会在现实世界中尝试(可能最简单的方法是使用两个硬币:两个正面 = 0,混合 = 1,两个反面 = 2)。我怀疑您会看到相同的结果。
您只有三个值,所以结果为 2 的概率始终为 1:3。你说得很对,得到 2,你连续五次得到 2 的几率大约是 0.04%,这在 81 卷中确实不太可能。但是在得到 2 之后,你再得到 4 的几率是(如你所说)1.23% — 可能性更大,并且在 81 次掷骰中不足为奇。
我自己运行下面的程序,我经常在 81 卷批处理中运行三个,经常运行四个,但很少运行五个,相当很少运行六个。所有这些都在很大程度上符合我的预期。
Measuring the randomness of a PRNG是一个相当复杂的话题。最简单的衡量方法是运行它数百万次,然后查看您是否在大约 0.33333333% 的时间内获得了每个值。但当然,这可能是一百万个 0,然后是一百万个 1,再接着是一百万个 2,这将是一个可疑的随机结果。 :-) 但是如果您想测试您的设置,您可以尝试该维基百科文章中讨论的几种方法。或者订阅真正随机性的来源,例如 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());
}
}
}
关于java - Random.nextInt 返回连续的相同值整数(经常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46510518/