随机生成的数字的数学计算与计算的平均值不匹配

计算科学 随机数生成
2021-12-25 03:33:09

好的,很难在标题中解释我的问题。我希望这足以激发你们中的一些人的好奇心。

我一直在尝试做的是找到生成的随机数 (n) 的数量与生成相等数量的奇数和偶数的概率之间的关系。(n/2 奇数和 n/2 偶数)。应该清楚的是,n 必须是偶数。

显然,数字不必是奇数和偶数,只要有 50% 的机会生成其中一个即可。如果这张贴在错误的位置,有人可以引导我朝正确的方向前进。

无论如何,基本上我从数学上计算出,对于生成的每 n 个数字,在结果达到完美的 50/50(奇数和偶数)之前,平均应该进行大约 (4/5)sqrt(n) 次试验。

我使用斯特林的阶乘近似得到了 sqrt(n) 的结果,因为我认为最终结果会更容易理解并且更容易与我的计算结果进行比较。

但是,我计算的平均值给了我大约 (6/5)sqrt(n) 的结果,我不知道为什么。我使用了两个不同的伪随机生成器(Math.random() 和 java.util.Random())并且都产生了相同的结果。

下面是计算概率所涉及的数学,我也会提供代码。

如果看不懂请放大图片。

数学计算

用于计算计算的计算机程序:

public static void main(String[] args) {

    int run = 0;
    int total = 0;
    int amount = 0;
    int count = 0;
    int randint;
    int odd;
    int even;

    int n =100;                               // Amount of numbers generated randomly 
    int precision = 10000;                    // Amount of averages taken into account 
                                              // (Reduce with increase in "n" as time increases)

    Random generate = new Random(100);        // Seed 100 at beginning of program

    run = 1;

    while(run==1){

        odd = 0;
        even = 0;

        for(int i=0; i<n; i++){

            randint = generate.nextInt(2);

            if(randint%2==0){

                even++;  

            }else{

                odd++;

            }

        }

        count++;                            // increment count after every check

        if((odd==(n/2)) && (even==(n/2))){

            total+=count;                   // add count to total ( addition before addition - average calculation)
            amount++;                       // increment amount, this will be the division later
            count=0;

        }

        if(amount==precision){

            System.out.println(total/amount);  //print average
            run=0;



        }


    }

}
2个回答

如果那么你的java代码是近似而不是p=(nn/2)(12)n1pnp

这是两个精确函数和两个 sqrt 近似值的 wolfram alpha 代码,以及代码实际近似的函数的更好近似值 (5/4)*sqrt(n)(这来自 1/p 的英镑近似值)。

plot [ 1 /  ( choose[n, (n/2)] * (1/2)^n), n *  ( Choose[n, (n/2)] * (1/2)^n), (4/5)*sqrt(n), (6/5)*sqrt(n), (5/4)*sqrt(n) ] for n=50 to 150

解释是您的 java 代码正在逼近几何分布的平均值,其成功概率参数是(odd==(n/2)) && (even==(n/2)).

无论如何,基本上我从数学上计算出,对于生成的每 n 个数字,在结果达到完美的 50/50(奇数和偶数)之前,平均应该进行大约 (4/5)sqrt(n) 次试验。

(4/5)sqrt(n) 值是您尝试 n 次时获得的完美 (n/2):(n/2) 结果的预期数量,而不是获得完美所需的预期试验次数 ( n/2):(n/2)。

我看到我的其他答案可能令人困惑,所以我会再试一次。

这里有两点不一样:

  1. 当您尝试 n 次时,预期的完美数 (n/2):(n/2) 结果。
  2. 获得完美 (n/2):(n/2) 结果所需的预期尝试次数。

在您的问题和代码中,您似乎混淆了这两件事。在你的问题开始时,当你说

无论如何,基本上我从数学上计算出,对于生成的每 n 个数字,在结果达到完美的 50/50(奇数和偶数)之前,平均应该进行大约 (4/5)sqrt(n) 次试验。

你的文字似乎意味着(2),但你的公式是(1)。稍后在您复制粘贴的 tex 图像中,您说

50/50 结果的平均数是通过将结果乘以 n 得出的

该文本及其以下公式一致,它们都适用于(1)。您的 java 代码实现了您在文本介绍中描述的数量的近似值;这个实现和描述都是针对(2)的。

期望 (1) 和 (2) 不同,它们分别具有英镑近似值 (4/5)sqrt(n) 和 (5/4)sqrt(n)。如果您交替使用 (1) 和 (2),那么这就解释了为什么您会得到不一致的数字。