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

标签 java scala random statistics

当运行 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/

相关文章:

java - 应用程序在 Droid X 上崩溃

scala - Scala 中的 monoid 与 monad

javascript - 随机 1-5 5x5 阵列

java - setOnClickListener 语法错误?

java - Hibernate 干扰 Javamail 日志记录

scala - HList的证据保全LUB约束

scala - 如何将列转换为向量类型?

mysql - 归档 5 小时从表中随机记录,并将权重设为 1/4

java - 是否可以使用 Spring @Scheduled 注释安排作业每小时运行一次,但每次随机运行?

java - JNDI 连接适用于 Tomcat,但不适用于 Websphere