Как выбрать случайным образом в определенном соотношении - PullRequest
3 голосов
/ 02 декабря 2010

Я хочу выбрать случайным образом * между двумя альтернативами с неравной вероятностью.

Например, когда пользователь нажимает кнопку, 25% времени он издает звук А и 75% времени - звукБ. Я могу вручную сделать простые соотношения, такие как 1: 4 и 2: 4, но у меня проблемы с соотношениями, такими как 3: 5.

Какой общий способ думать об этом?

* Я имею в виду непредсказуемый взгляд на одного за другим.Я замечаю любой вопрос со словом случайный в нем получает Mensa педантов .

Ответы [ 5 ]

5 голосов
/ 02 декабря 2010

Соотношение 3: 5 эквивалентно 37,5% времени или 0,375 (в 3 раза больше A, в 5 раз B, поэтому 3/8 составляет 37,5%).Таким образом, вы можете рассчитать это следующим образом:

random() < 0.375 ? "A" : "B"

С

http://en.wikipedia.org/wiki/Ratio

Если есть 2 апельсина и 3 яблока, соотношение апельсинов кяблоки показаны как 2: 3, тогда как доля апельсинов в общем количестве фруктов составляет 2/5.

4 голосов
/ 02 декабря 2010

В течение 3: 5 вы можете сложить их вместе, чтобы получить 8, и выбрать случайное целое число меньше 8. Если это 0, 1 или 2 (три шанса), вы выбираете А, а если это 3, 4, 5, 6 или 7 (пять шансов) вы выбираете B. По кодам вы просто проверите, меньше ли ваше случайное число 3.

Для чего-то вроде 3: 5: 4 вы выбрали бы случайное число меньше 12 (3 + 5 + 4), и если оно меньше 3, вы выбираете A, в противном случае, если оно меньше 8 (3 + 5) вы выбираете B, в противном случае вы выбираете C.

Это может обобщать любое количество альтернатив, но это неэффективно с большим количеством альтернатив, поскольку вы должны проверять случайное число по каждому порогу, который равен O (n). Этот вопрос SO , кажется, предоставляет несколько более эффективных (но более сложных) алгоритмов для взвешенного случайного выбора с большим числом альтернатив.

3 голосов
/ 02 декабря 2010

Если у вас есть доступ к равномерному распределению случайных чисел между 0 и 1, вы можете сделать следующее:

Преобразуйте отношение в дробь, чтобы отношение стало некоторым числом x. (Например, 3: 2 станет 3/5 или 0,6) Возьмем случайное число y из равномерного распределения [0,1]. Если y

1 голос
/ 02 декабря 2010
if (random() % (A+B) < A) 
   do_A() 
else
   do_B();
1 голос
/ 02 декабря 2010

Предполагая, что ваш генератор случайных чисел возвращает двойное значение между 0,0 и 1,0, вы просто сравниваете точное соотношение, которое хотите. В случае 3 из 5 вы должны проверить, было ли случайное значение меньше 0,6.

if(rand < 0.6) {
    playSound(A);
}
else {
    playSound(B);
}
...