【问题标题】:Rand function yields uneven results兰德函数产生不均匀的结果
【发布时间】:2012-07-17 22:58:28
【问题描述】:

在我的程序中,$integers[0]->occurrences 的平均值应该是 20000。为什么它总是大于 20000,即使使用了 srand()?

<?php 
        define('NUM_OF_INTS',49);    
        define('DRAWS',1000000);

            class number
            {
               public $occurences;
               public $value;

               function number()                     
               {
                   $occurences=0;
                   $value=0;
               }
            }

            $integers = array();

            //srand(time(0));
            //initialising loop
            for($i=0;$i<=NUM_OF_INTS;$i++)
            {    
                $integers[$i] = new number(); 
                $integers[$i]->value = $i;

            }
            for($i=0;$i<DRAWS;$i++)
            {                  
                $integers[rand(0,NUM_OF_INTS)]->occurences++;               
            }

            foreach($integers as $int)
                printf("%5d %5d  <br/>",$int->value,$int->occurences);
        ?>

【问题讨论】:

  • 你是如何计算平均值的?它必须是(根据定义)20000,因为您将 1000000 次试验分成 50 个箱。
  • 总是高一点:20018 , 20028 , 20020 ,20022 ,20021 ,20017...
  • 不按此:ideone.com/uZdNF.
  • 所以,这似乎是PHP解析器的问题。我只用 WAMP 尝试了这段代码。
  • 忽略我上面说的;我误读了您的问题(我以为您是在谈论 跨 箱的平均值,而不是在多次运行中某个特定箱的平均值)。

标签: php random wamp


【解决方案1】:

你说你正在使用 WAMP。

PHP 的 rand() 在 Windows 上不是很随机(它只生成 15 位随机性),因此它无法在 50 个 bin 之间足够均匀地分配其随机数。

特别是 bin 0 将收到 656 / 32768 个随机数,大约为 0.0200195

【讨论】:

  • 但这没关系。每个 bin 的平均出现次数仍必须为 20000。
  • @OliCharlesworth 50 个 bin 的平均值是 20000,是的,但是 bin 0 的平均值总是 20019.5,因为随机数不够随机。
  • @Neil 你能解释一下你是如何得到分子中的 656 的吗? 32768/50 = 655.36 ,如果浮动通常是“地板”,它应该是 655。
  • 在 32768 个“输入”值中,每个值均匀地进入每个输出箱 655 次。剩下 18 个额外的输入值 (32768 - 655 * 50),这些值映射到输出 0 到 17,因此这些值比其他值出现的频率更高。
  • 等一下; “随机性”的数量与均匀性水平正交。有任何证据表明 PHP 的 rand 引入了倾斜分布?
【解决方案2】:

您是否尝试过使用 PHP 的 mt_rand 作为您的生成器?它比 rand 更擅长获得均匀分布。

您还可以生成两个随机数并将它们连接起来以获得长数字。

例如

//desired length of 16
rand16digits = str_pad(mt_rand(0,99999999), 8 , "0").mt_rand(10000000,99999999);

【讨论】:

  • 谢谢,我是 PHP 标准库的初学者,我发现它很有用。现在平均是20000,但分散在数百。
  • 如何测量色散?你是用标准差还是类似的东西?正如我所提到的,上面的函数会给你更多的正态分布。如果您正在寻找具有特定均值或方差的钟形曲线,您可以使用 mt_rand 来提供一个可以给您带来这种效果的函数。因为您正在处理大量数字,所以请注意不要为数据类型编写太大的数字(例如,通过将它们全部加起来),否则会发生不好的事情。
  • 更正:'更多的正态分布'应该是'更多的均匀分布'
  • 嗯。我刚刚查看了 PHP 源代码,mt_rand 中的范围限制例程与rand 中的相同,因此它们都同样容易受到不均匀性的影响...
  • 另外,您建议的连接例程会在分布中留下很大的空白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
相关资源
最近更新 更多