【问题标题】:PHP Random Number Generation IssuePHP 随机数生成问题
【发布时间】:2013-06-03 21:39:23
【问题描述】:
10,000 Loops
Range 0-1
Base Average: 0.5
Base Standard Deviation: 0.288675134595
=======================================

mt_rand()
Average: 0.337839939116
Standard Deviation: 0.264176807272
---

hexdec(sha1(*GUID*))
Average: 0.37834
Standard Deviation: 0.284251515902 <--
---

mt_rand() based from a SET of defined numbers [01234567899]
Average: 0.496042248107 <--
Standard Deviation: 0.321017564651
---

请有人帮忙,我似乎找不到一种方法来生成符合 0 到 1 之间连续均匀分布的随机数。

【问题讨论】:

  • 你想得到什么样的输出?
  • 10,000 个介于 0 和 1 之间的随机数,输出平均值为 0.5,标准差为 0.288675134595 (1/sqrt(12))

标签: php math random statistics probability


【解决方案1】:

根据php-best-random-numbersmt_rand 是最好的开箱即用 PHP 方法。

但是,问题在于您的随机数子集非常小。如果您生成 0 和 1 之间的随机数,您将得到非常小的偏差。因此,您可以在生成数字时增加数字,然后将它们除以最高数字。

Check this codepad 平均为0.500155330.29015651152368 在我的运行中的偏差。

请记住,如果您再次开始对值进行四舍五入以获得实际的 01,您的标准偏差将在 0.5 左右。

代码:

<?php
$start = 0;
$top = 10000;
$ar = array();
for ($x=1;$x<=10000;$x++) {
  $val = mt_rand($start, $top) / $top;
  $ar[] = $val;
}

$mean = array_sum($ar) / sizeof($ar);

$devs = array();
foreach($ar as $num) {
    $devs[] = pow($num - $mean, 2);
}

$standard_deviation = sqrt(array_sum($devs) / sizeof($devs));

echo 'Max: ' . max($ar);
echo chr(10);
echo 'Min: ' . min($ar);
echo chr(10);
echo 'Average: ' . $mean;
echo chr(10);
echo 'Deviation: ' . $standard_deviation;
?>

【讨论】:

  • 没问题。我确实看到我有一个$start=1,应该是$start=0。现在更新了。您也可以将顶部用作mt_getrandmax()manual for mt_getrandmax() 也有你的随机浮动以获得最佳效果
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 2017-04-10
  • 2014-07-20
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多