簡體   English   中英

如何從數組中獲取一個數組值?

[英]How to fetch one array value from the array?

嗨,我有這樣的數組

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 應該被獲取更多時間(該值是 %)。

制作另一個數組並重復數組的索引為其值的次數,然后隨機獲取值這會做你想要的

上面提到的數組將是

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,)

$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;

解決這個問題的一種方法是列出數組中值的累積總和,例如,如果值是 3、1 和 2,則累積總和將為 3、4 和 6。然后當你想要得到一個隨機元素,您生成一個介於 1 最大和之間的隨機整數,然后從累積和小於或等於隨機數的元素中選擇累積和最大的元素。 這樣,被選取的任何元素的 chanse 與其值成正比。

所以這是設置,創建累積總和:

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];
}

免責聲明:我沒有測試過這段代碼,所以不要指望它在復制粘貼上運行。 此外,無論您使用什么代碼,您都應該確保它使用蒙特卡羅方法以正確的概率返回元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM