Генерация случайных чисел в C - PullRequest
0 голосов
/ 03 декабря 2009

Я знаю, что этот вопрос задавали снова и снова. Мне нужны случайные числа от 0 до 9. Я использую следующий код:

srand(time());
int r;
for (;;)
{
    while(condition)
    {
        r = rand()%10;
        // ...
        // ...
    }
}

Теперь я получаю одинаковую последовательность чисел для каждой итерации цикла for. Может ли кто-нибудь предоставить мне правильный код?

PS - Мой компилятор не распознает arcrandom().

Ответы [ 9 ]

13 голосов
/ 03 декабря 2009

Эта проблема связана с тем, что в некоторых реализациях биты младшего разряда rand () не очень случайны. Цитата из справочной страницы :

"Если вы хотите сгенерировать случайное целое число от 1 до 10, вы всегда должны делать это, используя старшие биты, как в

j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

и никогда ничем не напоминающим

j = 1 + (rand() % 10);

(который использует младшие биты). "

7 голосов
/ 03 декабря 2009

Вы, вероятно, вызываете эту функцию в течение секунды, и srand будет засеян в ту же секунду Вы должны звонить srand только один раз в начале main.

2 голосов
/ 03 декабря 2009

Многие псевдослучайные генераторы имеют наблюдаемый период.
Если вам нужен длительный период, рассмотрите возможность использования алгоритма из Knuth 2 . Он имеет период около 2 ^ 55 и прост в реализации.
RANARRAY

1 голос
/ 03 декабря 2009

Удалить все srand() звонки из вашего кода.

Добавьте один, уникальный вызов прямо перед первым оператором в main().

int main(void) {
    int foo = 42;
    int bar = baz(42);

    srand(time(0));
    /* rest of your program */
    return 0;
}
0 голосов
/ 03 декабря 2009

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

random.org и randomnumbers.info (среди прочих) предоставят для загрузки действительно случайные числа, которые libcurl должен обработать для вас.

0 голосов
/ 03 декабря 2009

Единственный возможный способ получить точную такую ​​же последовательность чисел - это если в коде есть вызов srand (), который вы нам не показали. Это может быть где-то глубоко внутри вызова функции.

Правильный способ исправить это - найти дополнительный вызов srand и удалить его. Однако этот быстрый взлом может помочь вам начать:

static int seed = time();
int r;
for (;;)
{
    srand(seed++);
    while(condition)
    {
        r = rand()%10;
        // ...
        // ...
    }
}
0 голосов
/ 03 декабря 2009

Вы случайно ()?

руководство пользователя random ()

Я сделал простую программу:

int i;
for(i=0;i<40;i++)
printf("%d",rand()%10);

и получение 7938024839052273790239970398657627039991 - здесь повторяться не надо. Как долго ваша последовательность?

0 голосов
/ 03 декабря 2009

Ваш код не компилируется - for() недействительно C.

Вы уверены , что звоните srand только один раз, в начале программы и перед любыми rand вызовами? Вызов srand в цикле объяснил бы это поведение.

0 голосов
/ 03 декабря 2009
srand(time(0));

r = rand() % (max+1);

//r will be a random number between 0 and max.

Я могу только думать, что вы неправильно инициализировали или ваш отредактированный код отредактирован неправильно.

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