2010-08-15 3 views
2

Предположим, я хочу случайным образом выбрать число n между 0 и 30, где распределение произвольное и неравномерное. Каждое число имеет соответствующий вес P (n): P (0) = 5, P (1) = 1, P (2) = 30, P (3) = 25 и т. Д. И т. Д. Как сделать случайный выбор из этого набора, так что вероятность выбора числа пропорциональна его весу?Вероятностный выбор из набора

Что такое случайный выбор, даже называемый?

можно увидеть один из способов его реализации:

  1. Сделать справочной таблицы V, где V (п) = V (п-1) + P (п); с базовым регистром V (0) = P (0).
  2. Генерация случайных чисел X с равномерным распределением между 0 и максимальным значением V.
  3. Найти наименьшее значение п, что V (п)> X.

Это что-то вроде этого уже реализован в библиотеке? (Использование Perl.)

ответ

6

Это на самом деле является очень популярной проблемой, и называется взвешенная случайный выбор (или иногда взвешенная случайный выбор). Вот a complete article об этом.

+0

Ах! Эти ключевые слова - именно то, что мне нужно. Благодарю. – PBJ

+2

Мне удалось найти существующий модуль CPAN для этого (хотя он не слишком популярен): List :: Util :: WeightedChoice http://search.cpan.org/~dsadinoff/List-Util-WeightedChoice-0.06/ Библиотека/Список/Util/WeightedChoice.pm – PBJ

1
#!/usr/bin/perl 

use strict; use warnings; 

my @p = map { ($_) x int(1 + rand 50) } 0 .. 30; 
my @s = @p[ map rand @p, 1 .. 10 ]; 
print "@s\n"; 
Смежные вопросы