Rand函数产生不均匀的结果

在我的程序中,$ integers [0] - &gt;出现的平均值应该是20000.为什么它总是 大于20000,即使在使用srand()?</ p>

 &lt;?php 
define('NUM_OF_INTS',49);

defined('DRAWS',1000000);

类号
{
public $ occurences;
public $ value;

function number()
{
$ occurences = 0;

$ value = 0;
}
}

$ integers = array();

// srand(time(0));
//初始化循环
for($ i = 0; $ i&lt; = NUM​​_OF_INTS; $ i ++)
{
$整数[$ i] =新数字();

$整数[$ i] - &gt; value = $ i;

}
for($ i = 0; $ i&lt; DRAWS; $ i ++)
{
$整数[rand(0, NUM_OF_INTS)] - &GT; OCCURENCES ++;

foreach($整数为$ int)
printf(“%5d%5d&lt; br /&gt;”,$ int-&gt; value,$ int-&gt; occurences);
? &gt;
</ code> </ pre>
</ div>

展开原文

原文

In my program, the average value of $integers[0]->occurences should be 20000.Why it's always larger than 20000, even after using 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);
        ?>

doune1000
doune1000 忽略我上面所说的话;我误解了你的问题(我以为你是在谈论箱子的平均值,而不是多次运行中一个特定箱子的平均值)。
8 年多之前 回复
douxin0251
douxin0251 所以,它似乎是PHP解析器的问题。我只用WAMP尝试了这段代码。
8 年多之前 回复
dongna9185
dongna9185 不是这样的:ideone.com/uZdNF。
8 年多之前 回复
doucezhu3570
doucezhu3570 总是高一点:20018,2002,20020,2002,20021,20017......
8 年多之前 回复
doujiaozhao2489
doujiaozhao2489 你是如何计算平均值的?它必须(根据定义)20000,因为你将1000000试验分成50个箱。
8 年多之前 回复

2个回答



你说你正在使用WAMP。</ p>

PHP的 rand()< / code>在Windows上不是很随机(它只生成15位的随机性),因此无法在50个二进制位之间均匀地分配其随机数。</ p>

特别是bin 0 将收到656/32768的随机数,约为0.0200195 </ p>
</ div>

展开原文

原文

You say that you're using WAMP.

PHP's rand() isn't very random on Windows (it only generates 15 bits of randomness) so it's unable to distribute its random numbers evenly enough between the 50 bins.

In particular, bin 0 will receive 656 / 32768 of the random numbers, which is about 0.0200195

donglu8334
donglu8334 实际上,他们使用的是分而不是模数。
8 年多之前 回复
duanju8308
duanju8308 我没有看过源代码,所以我猜他们至少会尝试均匀地分配偏斜,尽管在这种情况下,这只是意味着大约每三个值会更频繁地出现。
8 年多之前 回复
doulan6150
doulan6150 我回答我自己的问题; 是! 我只是查看了源代码(/ext/standard/rand.c),虽然有评论声称他们正在消除偏差,但他们真的没有。
8 年多之前 回复
doufud21086
doufud21086 不挂断; “随机性”的量与均匀性水平正交。 任何证据表明PHP的兰德引入了偏态分布?
8 年多之前 回复
doubi5520
doubi5520 在32768个“输入”值中,每个值均匀地进入每个出纸槽655次​​。 这留下了18个额外的输入值(32768 - 655 * 50),并且这些值映射到输出0到17,因此这些值比其余值更频繁地出现。
8 年多之前 回复
dongwei8729
dongwei8729 你能解释一下你是如何在分子中得到656的吗? 32768/50 = 655.36,如果浮点数通常是“浮动”,则应为655。
8 年多之前 回复
duanjigua5753
duanjigua5753 啊哈,看来我误解了这个问题。
8 年多之前 回复
dongyin8009
dongyin8009 50个分档的平均值是20000,是的,但是bin 0总是平均20019.5,因为随机数不够随机。
8 年多之前 回复
drbhjey445647
drbhjey445647 但那没关系。 每个箱的平均出现次数必须仍为20000。
8 年多之前 回复



您是否尝试过使用PHP的mt_rand作为生成器? 获得均匀分布比rand更好。</ p>

你也可以生成两个随机数并将它们连接起来得到长数。</ p>

例如< / p>

  //所需长度为16 
rand16digits = str_pad(mt_rand(0,99999999),8,“0”)。mt_rand(10000000,99999999);
</ code > </ pre>
</ div>

展开原文

原文

Have you tried using PHP's mt_rand as your generator? It is better at getting a even distribution than rand.

you can also generate two random numbers and concatenate them to get long ones.

e.g.

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

dory4404
dory4404 然后翻转它。
8 年多之前 回复
douzhao2047
douzhao2047 这仍然无济于事。 它永远不会生成以00000000结尾的数字。
8 年多之前 回复
drus40229
drus40229 查看更新的代码以解决您的问题
8 年多之前 回复
dongzhuzhou4504
dongzhuzhou4504 用我的直觉衡量。 现在$ integers [0] - > occurences = 19939,2004,8,1671,19991,20203 ......
8 年多之前 回复
dousong1926
dousong1926 因为,例如,rand16digits永远不能是100000000000000。
8 年多之前 回复
dongshushen4392
dongshushen4392 为什么如果是均匀分布?
8 年多之前 回复
dongyi1748
dongyi1748 此外,您建议的连接例程将在分发中留下很大的空白。
8 年多之前 回复
dongyixiu3110
dongyixiu3110 嗯。 我刚刚查看了PHP源代码,mt_rand中的范围限制例程与rand中的范围限制例程相同,因此它们同样容易受到非均匀性的影响......
8 年多之前 回复
dongzhi2887
dongzhi2887 修正:“更多的正常分布”应该是“更多的均匀分布”
8 年多之前 回复
dtvfxzq3802
dtvfxzq3802 你是如何测量色散的? 你是采取标准偏差还是那样的? 正如我所提到的,上面的函数将为您提供更多正态分布。 如果您正在寻找具有特定均值或方差的钟形曲线,则可以使用mt_rand来提供将为您提供该效果的函数。 因为你正在处理大数字,所以要小心你不要为数据类型写一个太大的数字(例如通过总结它们),否则就会发生坏事。
8 年多之前 回复
douaikuai2715
douaikuai2715 谢谢,我是PHP标准库的初学者,我发现它很有用。 现在平均值是20000,但分散度是几百。
8 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐