我在运行scala.util.Random().nextInt(3)
81次时会看到如下所示的结果(Java开发人员,请参阅edit
了解其相关性):
200010202002112102222211012021020111220022001021101222222022210222220100000100010
注意大的连续块:
000
,22222
,111
,222222
,222
,22222
,00000
,000
。
直观地说,序列似乎不是自然的/“真实世界的硬币翻转”随机。
例如,要实现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}}。
答案 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());
}
}
}