Генерация набора случайных событий на предопределенной частоте - PullRequest
1 голос
/ 27 апреля 2009

У меня есть набор событий, которые должны происходить случайным образом , но с заранее определенной частотой. т. е. в течение (полностью) бесконечных событий, событие A должно происходить в 10% случаев, событие B должно происходить в 3% и т. д. Конечно, общая сумма процентов в списке событий добавится до 100.

Я хочу достичь этого программно. Как мне это сделать?

Ответы [ 6 ]

4 голосов
/ 27 апреля 2009

Вы не указали язык, поэтому здесь приводится псевдокод

В основном вам нужна функция, которая будет вызывать другие функции с различными вероятностями

Function RandomEvent

    float roll = Random() -- Random number between 0 and 1
    if roll < 0.1 then
        EventA
    else if roll < 0.13 then
        EventB
    ....
1 голос
/ 27 апреля 2009
  1. Создайте последовательность событий в нужных вам пропорциях.
  2. Для каждого события случайным образом генерируйте метку времени, когда каждое событие должно быть доставлено, в пределах ваших временных границ.
  3. Сортировать по этой отметке времени
  4. Пробежитесь по списку, доставив каждое событие в соответствующее время.
1 голос
/ 27 апреля 2009

Для каждого события генерируйте случайное число от 0 до 100. Если событие A должно происходить в 10% случаев, отобразите значения 0–10 на событие A и т. Д.

Например, для 2 событий:

n = 0 - 10 ==> Event A
n = 11 - 99 ==> Event B

Если вы сделаете это, ваши события могут происходить в случайное время, а если время работы достаточно велико (и ваш ГСЧ достаточно хорош), частоты событий составят желаемый процент.

1 голос
/ 27 апреля 2009

Вы должны уточнить немного, что вы имеете в виду. Если вы просто хотите, чтобы вероятности были такими, как вы описали, просто выберите случайное число от 1 до 100 и сопоставьте его с событиями. То есть, если случайное число 1-10, выполните Событие A. Если это 11-13, выполните Событие B и т. Д.

Однако, если вам требуется, чтобы все время получалось в точности с такими пропорциями (не то, что это действительно возможно), вы должны сделать это по-другому. Пожалуйста, подтвердите, какое значение вы ищете, и я отредактирую при необходимости.

1 голос
/ 27 апреля 2009

интересное описание. Без конкретных деталей, ограничивающих имплементацию, я могу только предложить идею, которую вы можете изменить, чтобы она соответствовала уже выбранному вами варианту реализации. Если у вас есть файл, для которого каждая строка содержит одно событие, то создайте файл так, чтобы в нем было 10% строк A, 3% B строк и т. Д. Затем, выбирая событие, получите случайное число, сгенерированное случайным образом, чтобы выбрать номер строки из файл.

0 голосов
/ 27 апреля 2009

Выберите случайное число от 1 до 100 включительно. Назначьте каждому событию уникальный набор целых чисел, который представляет частоту, с которой оно должно происходить. Если вы случайно сгенерировали число, попадающее в этот конкретный выбранный диапазон чисел, запустите соответствующее событие.

В приведенном выше примере событие, которое должно показывать 10% времени, вы бы присвоили ему диапазон целых чисел длиной 10 целых (1-10, 12-21 и т. Д.). Как вы храните эти целые диапазоны, зависит от вас.

Как сказал Майкл, поскольку это случайные числа, невозможно гарантировать, что указанное событие происходит ровно в 10% случаев, но в долгосрочной перспективе оно должно ... при равномерном распределении случайных чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...