Рандом с вероятностью у элементов?

Здравствуйте, каким образом можно сделать функцию которая будет выводить случайны результат по массиву? У этих элементов есть шанс выпада.

[
 {
   "id" : 1,
   "chance" : 10
 },
 {
   "id" : 20,
   "chance" : 70
 },
 {
   "id" : 34,
   "chance" : 20
 }
]


Есть одна теория. Создать временный массив из 100 элементов и продублировать туда id [1...1, 20 .... 20, 34 .... 34]. Но мне кажется это не лучшим решением. Подскажите пожалуйста
  • Вопрос задан
  • 1250 просмотров
Решения вопроса 2
@Quieteroks
php программист
Вариантов решения море. Зависит от Вашей фантазии.
Я бы сделал так:
1. Посчитать текущий шанс выпадения, как-нибудь так mt_rand(0, 10000) / 100.
2. Отфильтровать массив для удаления элементов с шансом ниже чем у шага 1.
3. Выполнить например array_shuffle.
4. Выбрать нужное количество элементов.

Если же шанс нужен для каждого элемента считать отдельно, то соответственно это происходит во время фильтрации. Благо имеется фильтрация с колбеком: php.net/manual/ru/function.array-filter.php
Ответ написан
Комментировать
@WQP Автор вопроса
$els = array(
	array('id'=> 1,'chance' => 10),
	array('id'=> 2,'chance' => 15),
	array('id'=> 3,'chance' => 1),
	array('id'=> 4,'chance' => 20),
	array('id'=> 5,'chance' => 50),
);

function getItem($data) {
	$randArray = array();

	foreach ($data as $value) {
		for ($i = 0; $i < $value['chance']; $i++) { 
			$randArray[] = $value['id'];
		}
	}

	return $randArray[mt_rand(0, count($randArray) - 1)];
}


Сделал так
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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