Выбор случайного элемента с заданными вероятностями

M
На сайте с 22.02.2007
Offline
161
779

Имеется массив:

ID Опция Вероятность

1 Выбор1 5

2 Выбор2 10

3 Выбор3 10

4 Выбор4 25

5 Выбор5 50

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

Торрент Трекер Катушка - скачать фильмы (http://katushka.net) | SmartProgress - достижение целей (https://smartprogress.do/) Партнерская программа SmartProgress (https://smartprogress.do/affiliate)
ДП
На сайте с 23.11.2009
Offline
203
#1

Суммируете вероятности, выбираете случайное число от нуля до суммы вероятностей, пробегаетесь по массиву, суммируете вероятности, как только сумма стала больше выбранного случайного числа - текущий элемент - ваш.

[Удален]
#2

ну если начать, что распределение генератора случайных чисел на больших интервалах далеко не случайно :-)))))

то я бы сделал так.


$chances = array(
1 => 5,
2 => 10,
3 => 10,
4 => 25,
5 = 50
);

$results = array();
for($i = 0; $i < 100; $i++)
{
$rnd = rand(0,99);
$from = 0;
foreach($chances as $result => $max)
{
$max = $from + $max;
if( $from < $rnd && $rnd < $max) $results[$result]++;
$from = $max;
}
}

$winner = array_search(max($results), $results);

чтото такое, подход думаю объяснил, если опечатался - простите уж, не проверял :-)

да и писать код в строке ответа неудобно :(

WS
На сайте с 17.11.2010
Offline
25
#3

как-то так

function getCase(){
$chances = array('Выбор1'=>5,'Выбор2'=>10,'Выбор3'=>10,'Выбор4'=>25,'Выбор5'=>50);
$id = rand(0,99); $k = 0;
foreach($chances as $key => $value){
if($id>=$k && $id< $k + $value) {
return $key;
}
$k += $value;
}
return null;
}

WhiteSmartFox добавил 14-02-2011 в 18:40

seodude:
я бы сделал так

Честно говоря совершенно не понял код, в результате как я понимаю будет массив $winner примерно равный массиву $chances, а смысл в нем? Задание было по моему совсем другим.

[Удален]
#4

WhiteSmartFox, ужасть =)

да, вы видимо не поняли код)

это просто 100 итераций и запоминание наиболее частого с этими вероятностями.

тупо говоря - ваш код * 100 :))

WS
На сайте с 17.11.2010
Offline
25
#5
seodude:
это просто 100 итераций и запоминание наиболее частого с этими вероятностями.

Это не поможет. Если вы говорите что распределение не случайно вы таким образом только УВЕЛИЧИВАЕТЕ неслучайность. Скажем если чаще будут выпадать числа от 0 до 5, то прогнав 100 раз вы значительно увеличите вероятность выпадения числа от 0 до 5.

P.S. Для небольшого кол-ва итераций не совсем случайностью рандома можно вполне пренебречь.

[Удален]
#6

WhiteSmartFox, оба кода хороши, как и наши горожи 🤣

пусть выбирает, мне без разницы =)

M
На сайте с 22.02.2007
Offline
161
#7

Всем спасибо! WhiteSmartFox, огромное спасибо! :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий