Как выбрать элемент из массива с разным весом вероятности?

Здравствуйте,

Имеется массив данных, допустим:
$array = [];
$array[] = array("value"=>"val1","procent"=>"0.6");
$array[] = array("value"=>"val2","procent"=>"0.3");


Как выбрать элемент 1 с вероятностью 0.6, а второй 0.3
Т.е. при большом количестве повторений отдавалось val1 в 2 чаще чем val2
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
$total = array_reduce($array, function($sum,  $item) { return $sum + $item['procent'] }, 0);
$prob = rand() / getrandmax() * $total;
foreach ($array as $item) {
  if ($prob <= $item['procent']) {
    $randItem = $item['value'];
    break;
  }
  $prob -= $item['procent'];
}
echo $randItem;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Stimulate
@Stimulate
могу
if (mt_rand(0, 100) <= 60) {} 
if (mt_rand(0, 100) <= 40) {}
Ответ написан
Adamos
@Adamos
$sum_weight = 0;
foreach($values as $value) {
  $sum_weight += $value['procent'];
}
$rest = rand(0, 100500) / 100500 * $sum_weight;
$result = false;
foreach($values as $value) {
  if($value['procent'] >= $rest) {
    $result = $value['value'];
    break;
  }
  $rest -= $value['procent'];
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы