gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:25:36 29 4
gpt4 key购买 nike

当运行 scala.util.Random().nextInt(3) 81 次时,我看到如下结果(Java 开发人员,请参阅 edit 了解这之间的关系):

200010202002112102222211012021020111220022001021101222222022210222220100000100010

注意大的连续 block :000, 22222, 111, 222222, 222, 2222200000000

从直觉上看,这个序列看起来并不自然/“真实世界的抛硬币”是随机的。

例如,要实现 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com