嗨我有这样的数组
Array (
[0] => stdClass Object (
[id] => 1930 [value] => 20)
[1] => stdClass Object (
[id] => 1931 [value] => 30 )
[2] => stdClass Object (
[id] => 1937 [value] => 30 )
[3] => stdClass Object (
[id] => 1938 [value] => 20 )
)
我想从中获取随机数组。应该获取具有更大值(%)的Id更多时间(该值为%)。
答案 0 :(得分:1)
创建另一个数组并重复数组索引的次数,然后随机获取值,这样做就可以了。
上面提到的数组将是
array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,)
答案 1 :(得分:0)
$arr = Array (
(Object) array (id => 1930, value => 20),
(Object) array (id => 1931, value => 30),
(Object) array (id => 1937, value => 30),
(Object) array (id => 1938, value => 20));
// count sum of all values
$sum = array_reduce($arr, function ($c, $i) { return $c += $i->value; }, 0);
// get random
$rand = mt_rand(0, $sum);
echo $rand . " ";
// select 1st item that sum of values >= random value
$new = array_filter($arr, function ($i) use (&$rand) { if($rand > 0 && ($rand -= $i->value) <= 0) return true; else return false; });
// change key to 0
$new = array_values($new);
echo $new[0]->id;
答案 2 :(得分:0)
解决此问题的一种方法是列出数组中值的累积和,例如,如果值为3,1和2,则累计和将为3,4和6.然后当您想要得到一个随机元素,你生成一个1最大和之间的随机整数,然后选择累积和最小的元素,累积和小于或等于随机数。这样,被挑选的任何元素的通道都与其值成比例。
所以这是设置,创建累积总和:
var $cumsum = array();
var $sum = 0;
foreach($array as $obj) {
$sum += $obj->value;
array_push($cumsum, $sum);
}
var $maxsum = end($cumsum);
这是实际选择元素的函数:
function getRandomObject() {
var $r = random(1, $max);
if($r < $cumsum[0]) return $array[0];
for($i = 0; $i < count($cumsum); $i++)
if($cumsum[$i]) > $r)
return $array[$i--];
return $array[$i];
}
Disclaimar:我还没有测试过这段代码,所以不要指望它在复制粘贴上运行。此外,无论你使用什么代码,你应该确保它使用monte carlo方法以正确的概率返回元素。