微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么随机概率结果的方差足够大?

为什么随机概率结果的方差足够大?

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连接,并保持打开状态

在n秒之后,用python终止一个函数调用

信息:

$ 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脚本如何知道自己的内存占用情况?

捕获stream程进入/退出的任何可能的解决scheme?

$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] 举报,一经查实,本站将立刻删除。

相关推荐