подсчет числа с использованием случайного числа rand () - PullRequest
0 голосов
/ 31 марта 2011

Я изучаю C и нахожу rand() очень странным, возможно, из-за его случайности: p

У меня следующий код, он всегда выводит 1, есть ли проблемы?Как бы вы изменили код, чтобы он выполнял свою работу?

Cheers,

#include <stdlib.h>

double rand_double()
{
    double ret = (double)rand();
    return ret/(RAND_MAX+1);
}

int sample_geometric_rv(double p)
{
    double q;
    int n = 0;
    do
    {
        q = rand_double();
        n++;
    } while (q >= p);
    return n;
}

int main()
{
    int ans = sample_geometric_rv(0.1);
    printf("Output %d\n", ans);
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 31 марта 2011

Вам нужно заполнить генератор случайных чисел ONCE . Используйте srand() с другим значением каждый раз, когда вам нужна другая последовательность.

В случае отсутствия посева, вы как бы выдали srand(1);

Как правило, ГСЧ засевается в main() с текущим временем в качестве значения инициализации. Текущее время, возвращаемое time(), почти гарантированно будет различным при каждом запуске программы (оно меняется один раз в секунду).

#include <stdlib.h>
#include <time.h>

int main(void) {
    srand(time(0));
    /* rest of program; no more calls to srand() */
    return 0;
}

Обратите внимание, что если вы инициализируете ГСЧ с тем же номером, вы получите ту же последовательность. Это может быть интересно, например, повторить данные.

Обратите внимание, что на разных компьютерах один и тот же номер инициализации не должен генерировать одинаковые номера.

1 голос
/ 31 марта 2011

RAND_MAX здесь очень вероятно (2 ^ 31) -1 (максимальное 32-разрядное целое число со знаком), поэтому добавление 1 приводит к его переносу и становится отрицательным, что, в свою очередь, означает, что p превысит q для любого положительного значения p,Измените это:

 return ret/(RAND_MAX+1);

на следующее:

 return ret/((double)RAND_MAX+1.0);

Рекомендуется также посев ГСЧ (как ранее предлагалось).

...