使用随机数进行硬币投掷并不是完全随机的

时间:2016-04-29 11:45:40

标签: java random coin-flipping

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

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个尾巴。 不是随机的。它可能,但如果程序是正确的,我想要一般意见?我在数学上遗漏了什么吗?

5 个答案:

答案 0 :(得分:1)

20次运行的样本量不足以评估它的随机性。可以这样想:如果你做了4次跑步并得到了4个头,那你就会想,&#34;哇,这根本不是随机的。&#34;但事实上,如果你拿了4个硬币,并将它们翻了16次,那么你应该至少得到所有4个头。因此,如果您进行少量运行,并且您得到的结果在头尾之间不是平均分配的,那并不意味着它不是随机的。

或者以这种方式看待它:如果你写了一些刚打印的代码&#34; Heads&#34;那么&#34; Tails&#34;然后&#34;负责人&#34;等等,你得到半个半头和半个尾巴。但这根本不是随机的!它只是一种重复模式。

因此,当随机结果在短期内看起来不均匀时,故事的寓意不会让人感到惊讶。尝试重新编写代码,以便计算出多少个头和多少尾巴,然后让它翻转大约一百万左右,看看你是不是每个大约有500,000个。它应该多一点或多一点,因为随机并没有给你准确,但它应该更接近。

答案 1 :(得分:0)

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

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

之间返回一个随机整数

答案 2 :(得分:0)

您需要更多输入才能获得相同数量的输入。对于如此少量的输出,有时你会在数字方面让它们彼此接近,有时候一方会显示&#34;显示&#34;其他方式更多。实际上,4尾巴和16头部的概率是0.462%,这在某种程度上是现实的&#34;发生...尝试使用更多的运行次数来更多地使用它,看看它的行为方式。

顺便考虑一下这个输入:

6 6 6 6 6 6 6 6 6 6

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

答案 3 :(得分:0)

  

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

     

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

     

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

     

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

答案 4 :(得分:0)

稍微修改了你的代码,它看起来很随机。

代码:

    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

我猜这是随机性的事情^^