алгоритм случайности - PullRequest
       7

алгоритм случайности

1 голос
/ 13 ноября 2008

Мне нужна помощь в отношении алгоритма случайности. Итак, проблема в том.

В течение 8 часов должно произойти 50 событий. События могут происходить в случайное время. Теперь это означает, что в каждую секунду есть вероятность того, что событие произойдет: 50 / (8 * 60 * 60) = .001736. Как я могу сделать это с алгоритмом случайной генерации?

Я могу получить случайное число

int r = rand();
double chance = r/RAND_MAX;
if(chance < 0.001736)
    then event happens
else
    no event

Но в большинстве случаев rand () возвращает 0 и 0 <0,001736, и я получаю больше событий, чем требуется. </p>

Есть предложения?


прости, я забыл упомянуть Я рассчитал шанс как двойной шанс = (static_cast) (r) / (static_cast) (RAND_MAX);


Удаляется double из static_cast

двойной шанс = (двойной) r / (двойной) (RAND_MAX);

Ответы [ 5 ]

7 голосов
/ 13 ноября 2008

Если вы выбираете, будет ли событие происходить каждую секунду, у вас будет изменение 0 происходящих событий или 8 * 60 * 60 происходящих событий. Если 50 событий являются ограничением, выберите 50 случайных времен в течение 8-часового периода и сохраните их.

7 голосов
/ 13 ноября 2008

Оба r и RAND_MAX являются целыми числами, поэтому выражение

double chance = r / RAND_MAX;

вычисляется с целочисленной арифметикой. Попробуйте:

double chance = 1.0 * r / RAND_MAX;

, что приведет к делению с плавающей точкой.

Однако лучшим решением было бы использование случайной функции, которая возвращает значение с плавающей запятой в первую очередь. Если вы используете генератор целочисленных случайных чисел, вы получите некоторые ошибки смещения в своих вычислениях вероятности.

2 голосов
/ 13 ноября 2008

Точно 50 или в среднем 50?

Возможно, вы захотите заглянуть в Экспоненциальное распределение и найти библиотеку для вашего языка, которая его поддерживает.

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

Вы можете "подделать" его с помощью единого ГСЧ следующим образом:

    double u;
    do
    {
        // Get a uniformally-distributed random double between
        // zero (inclusive) and 1 (exclusive)
        u = rng.nextDouble();
    } while (u == 0d); // Reject zero, u must be +ve for this to work.
    return (-Math.log(u)) / rate;
2 голосов
/ 13 ноября 2008
  • Создайте список из 50 номеров.
  • Заполните их случайным числом от 1 до 8 * 60 * 60.
  • Сортировать их

И у вас есть 50 секунд.

Обратите внимание, что вы можете иметь дубликаты.

0 голосов
/ 13 ноября 2008

Почему бы не создать список из 28 800 элементов и не извлечь из него 50 элементов, чтобы определить время событий? Это предполагает, что 2 события не могут происходить одновременно, и каждое событие занимает 1 секунду времени. Вы можете использовать генератор случайных чисел для генерации целочисленных значений от 0 до x, чтобы можно было выбирать в пределах.

...