0

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

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 个反面。这似乎不是随机的。它可能,但如果程序正确,我想要一个普遍的意见?我在数学上错过了什么吗?

4

5 回答 5

1

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

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

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

于 2016-04-29T11:58:15.883 回答
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

我想这就是随机性^^

于 2016-04-29T12:11:20.247 回答
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)0返回一个介于和之间的随机整数i-1

于 2016-04-29T11:50:48.560 回答
0

您需要更多的输入才能获得相同数量的输入。对于如此少量的输出,有时您会使它们在数量上彼此接近,有时一侧会比另一侧“显示”更多。4实际上,出现正面和16反面的概率在0.462%某种程度上是“现实的”……尝试用更多的运行次数来玩它,看看它的表现如何。

顺便说一句,想想这个输入:

6 6 6 6 6 6 6 6 6 6

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

于 2016-04-29T11:57:09.177 回答
0

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

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

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

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

于 2016-04-29T12:02:45.703 回答