【问题标题】:Coin toss using random numbers does not appear exactly random使用随机数抛硬币看起来并不完全随机
【发布时间】:2016-04-29 11:45:39
【问题描述】:

我想要一个随机数生成器来模拟抛硬币,这就是我所做的

public class CoinToss
{
    public static void main(String args[])
    {
        int num=(int)(1000*Math.random());
        if(num<500)
            System.out.println("H");
        else
            System.out.println("T");
    }
}

结果令人沮丧,因为我在 20 次运行中得到了 16 个正面和 4 个反面。 这并不似乎是随机的。它可能,但如果程序正确,我想要一个普遍的意见?我在数学上遗漏了什么吗?

【问题讨论】:

  • 尝试多运行几次。你可能会得到更好的结果。
  • 20 个样本在数学上毫无意义,托盘再放一个更大的样本(至少 10k)
  • 是的,@Preuk 是对的。我刚刚用 max_int 循环了你的例子,结果如下:H:1073754033,T:1073729614
  • 您最初的问题是您认为“完全随机”这个词是有意义的。 :-)

标签: java random coin-flipping


【解决方案1】:

稍微修改了你的代码,它似乎足够随机。

代码:

    int h = 0;
    int t = 0;
    for (int i = 0; i < 1000; i++) {
        int num = (int) (1000 * Math.random());
        if (num < 500) {
            h++;

        } else {
            t++;

        }
    }
    System.out.println("T:" + t);
    System.out.println("H:" + h);

输出:

T:506
H:494

我猜这就是随机性^^

【讨论】:

    【解决方案2】:

    20 次运行的样本量不足以评估其随机性。可以这样想:如果你跑了 4 次,得到 4 次正面,你会想,“哇,这根本不是随机的。”但事实上,如果你拿了 4 个硬币,并把它们翻转了 16 次,你希望至少得到所有 4 个正面的一次。因此,如果您进行少量运行,并且您得到的结果在正面和反面之间分布不均,这并不意味着它不是随机的。

    或者这样看:如果您编写的代码只打印“Heads”,然后是“Tails”,然后是“Heads”,依此类推,你会得到一半正面和一半的尾巴。但这根本不是随机的!这只是一个重复的模式。

    因此,当随机结果在短期内看起来参差不齐时,不要让故事的寓意感到惊讶。试着重写你的代码,让它计算有多少正面和多少反面,让它翻转大约一百万左右,看看你是否每个都没有得到大约 500,000。它应该多一点或少一点,因为随机不会给你准确的,但它应该更接近。

    【讨论】:

      【解决方案3】:

      您的代码似乎是正确的,尽管您可以更轻松地实现它:

      Random r = new Random();
      int num = r.nextInt(2);
      if (num == 0)
          System.out.println("H");
      else
          System.out.println("T");
      

      Random#nextInt(int i) 返回一个介于0i-1 之间的随机整数

      【讨论】:

      • 您的代码似乎是正确的,尽管您可以更轻松地实现它:r.nextBoolean(); ;)
      【解决方案4】:

      伪随机数生成器 (PRNG),也称为确定性随机位生成器 (DRBG),是一种用于生成数字序列的算法,其属性近似于随机数序列的属性。

      PRNG 生成的序列并不是真正随机的,因为它完全由一组相对较小的初始值决定,称为 PRNG 的种子

      虽然可以生成更接近真正随机的序列

      当然,任何考虑产生随机数字的算术方法的人都处于罪恶状态。约翰·冯·诺依曼

      【讨论】:

        【解决方案5】:

        您需要更多的输入才能获得相同数量的输入。对于如此少量的输出,有时您会使它们在数量上彼此接近,有时一侧会比另一侧“显示”更多。实际上,出现4 tails 和16 heads 的概率是0.462%,这在某种程度上是“现实的”......尝试更多地使用它,并查看它的行为。

        顺便想想这个输入:

        6 6 6 6 6 6 6 6 6 6
        

        似乎不是随机的,对吧?但它在某些时候以数字π 的十进制形式存在,因此它是随机系列的一部分。这只是一个系列大小的问题,所以当你使用随机数时,你必须以这种方式思考。更多地考虑随机生成器而不是结果。您使用的是正确的函数,因为它基于 System.nanoTime(),所以生成器是正确的,但您的结果很小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-23
          • 2017-02-25
          • 2018-07-27
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 2013-04-03
          • 1970-01-01
          相关资源
          最近更新 更多