php 按比重随机抽样 方法

/**
 * 按比重随机抽样
 * @author yanjingang@mail.com
 * @param array $weight 随机值=>比重 例如array(‘a’=>20,’b’=>30,’c’=>50)
 * @return string key 键名
 */
function randByWeight($weight = array()) {
$rand = rand(1, array_sum($weight));
$randval = 0;
$_tmpw = 0;
foreach ($weight as $k => $w) {
$min = $_tmpw;
$_tmpw += $w;
$max = $_tmpw;
if ($rand > $min && $rand <= $max) {
$randval = $k;
break;
}
}
return $randval;
}
//测试
$key = randByWeight(array(‘a’ => 200, ‘b’ => 300, ‘c’ => 500));
//随机比重验证
/* 各分值出现比重:
1分——5%
2分——20%
3分——10%
4分——4%
5分——35%
6分——4%
7分——4%
8分——8%
9分——4%
10分——6%
 */
$rands = array();
for($i=0;$i<100;$i++){
$key = randByWeight(array(1=>5,2=>20,3=>10,4=>4,5=>35,6=>4,7=>4,8=>8,9=>4,10=>6));
if(isset($rands[$key]))
$rands[$key]++;
else
$rands[$key] = 1;
}
arsort($rands);
var_dump($rands);
/* 随机100次结果:
 分数 => 随机出现次数
 5 => 31
 2 => 23
 8 => 15
 10 => 8
 3 => 7
 7 => 5
 4 => 5
 6 => 3
 9 => 2
 1 => 1

*/

发表评论

邮箱地址不会被公开。