为什么随机概率结果的方差足够大?
testing代码:
function probability($chances) { asort($chances); $sum = array_sum($chances); $random = mt_rand(1,$sum); foreach($chances as $key => $chance) { if($random < $chance) return $key; } return $key; } $chances['case1'] = 10; $chances['case2'] = 30; $chances['case3'] = 60; $result = array(); for($i = 0; $i < 100000; $i++) @$result[probability($chances)]++; asort($result); $sum = array_sum($result); echo "CasetCounttOrigtResultn"; foreach($result as $key => $value) echo "$keyt$valuet".$chances[$key]."%t".round($value / $sum * 100)."%n";
结果:
Case Count Orig Result case1 14913 10% 15% case2 33099 30% 33% Case3 51988 60% 52%
有没有办法调整它? 我试图使用mt_srand() ,但它没有帮助。
如何无限地运行服务器脚本
我怎样才能以编程方式从C / C ++代码获取当前可用的内存量?
在Linux Mint LMDE上安装Chez Scheme 9.4
在Android手动启动3G连接,并保持打开状态
信息:
$ PHP -v PHP 5.3.10-1ubuntu3.2 with Suhosin-Patch (cli) (built: Jun 13 2012 17:20:55) copyright (c) 1997-2012 The PHP Group Zend Engine v2.3.0,copyright (c) 1998-2012 Zend Technologies with Xdebug v2.1.0,copyright (c) 2002-2010,by Derick Rethans with Suhosin v0.9.33,copyright (c) 2007-2012,by SektionEins GmbH $ uname -a Linux desktop 3.2.0-26-generic-pae #41-Ubuntu SMP Thu Jun 14 16:45:14 UTC 2012 i686 i686 i386 GNU/Linux
Syscall开销在Solaris与Linux
如何在我的Linux服务器上创buildPDF文件的缩略图/屏幕截图?
能够在Linux上从Java和/或Spring Security修改Active Directory
Perl脚本如何知道自己的内存占用情况?
$sum = max($chances);
max() array_sum() sum,使用array_sum()
我得到了这个结果:
Case Count Orig Result case1 11068 10% 11% case2 29672 30% 30% case3 59260 60% 59%
从运行这个版本的代码:
<?PHP function probability($chances) { asort($chances); $sum = array_sum($chances); $random = mt_rand(1,$sum); foreach($chances as $key => $chance) { $random -= $chance; if($random <= 0) { return $key; } } return $key; } $chances['case1'] = 10; $chances['case2'] = 30; $chances['case3'] = 60; $result = array(); for($i = 0; $i < 100000; $i++) { @$result[probability($chances)]++; } asort($result); $sum = array_sum($result); echo "CasetCounttOrigtResultn"; foreach($result as $key => $value) { echo "$keyt$valuet".$chances[$key]."%t".round($value / $sum * 100)."%n"; } ?>
你的随机数字是有缺陷的。
首先,考虑取消asort 。 它没有做任何有用的事情,这是混乱(以及缓慢)。 你正在整理数组100000次! 最好添加一个前置条件,即对数组进行排序(并在循环之前对其进行排序),或者实现不需要排序的算法。
其次,你需要确保每个案件的打击概率是正确的。 这些是你现在的可能性:
case1: 10 % (1 <= $random <= 10) case2: 20 % (11 <= $random <= 30) case3: 70 % (everything that didn't match prevIoUs cases)
你真正需要做的是这样的:
function probability($chances) { $sum = array_sum($chances); $random = mt_rand(1,$sum); $add = 0; foreach($chances as $key => $chance) { if($random <= $chance + $add) return $key; else $add += $chance; } return $key; }
这会给你预期的结果:
case1: 10 % (1 <= $random <= 10) case2: 30 % (11 <= $random <= 40) case3: 60 % (41 <= $random <= 100)
首先, probability比较是错误的,应该是<=而不是< 。
这应该至少使结果更一致(即10,20,70)
其次, case3是双重计数(如果nr <= 60,如果nr> 60)。
我会建议对代码进行更改:
function probability($chances) { $sum = array_sum($chances); $random = mt_rand(1,$sum); foreach($chances as $key => $chance) { if ($random <= $chance) { return $key; } } return 'rest'; }
然后在$chances数组中添加'rest'。 这必须按排序顺序显示。
$chances['case1'] = 10; $chances['case2'] = 30; $chances['case3'] = 60; $chances['rest'] = 'NA'; // for 60 < x <= 100
结果:
Case Count Orig Result case1 10083 10% 10% case2 19965 30% 20% case3 30084 60% 30% rest 39868 NA% 40%
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。