2012-11-07 5 views
9

У меня есть следующий метод, который генерирует случайное число:Rand() всегда возвращает ту же последовательность на повторном запуске приложения

int random_number() //Random number generator 
{ 
    int x = rand() % 1000000 + 1; //Generate an integer between 1 and 1000000 
    return x; 
} 

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

+3

['srand()'] (http://www.cplusplus.com/reference/clibrary/cstdlib/srand/) может пригодиться.Тем не менее, вы можете быть в депрессии, чтобы принять этот модул, когда/если вы обнаружите, что 1000000 значительно больше, чем большинство определений реализации [RAND_MAX] (http://www.cplusplus.com/reference/clibrary/cstdlib/RAND_MAX/). – WhozCraig

ответ

17

Вы должны seed генератора случайных чисел, например:

srand (time(NULL)); 
int x = rand() % 1000000 + 1; 

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

EDIT:

Чтобы уточнить, вы должны сеять только один раз и получить много случайных чисел, что-то вроде этого:

srand (time(NULL)); 
loop { 
    int x = rand() % 1000000 + 1; 
} 

Вместо того, чтобы что-то вроде:

loop { 
    //Particularly bad if this line is hit multiple times in one second 
    srand (time(NULL)); 
    int x = rand() % 1000000 + 1; 
} 
+0

Ваше предложение сработало, но кажется, что число не меняется от одного цикла к другому. Поэтому все файлы имеют одно и то же имя – Matthew

+0

Если вы повторяете цикл, не вызывайте srand на каждой итерации. Назовите его только один раз, и rand много раз. Если вы вызываете оба раза, любые вызовы в пределах одной секунды возвращают одинаковый номер (поскольку время (NULL) будет возвращать одно и то же значение). – femtoRgon

+0

Спасибо. Это решило проблему :) – Matthew

5

позвоните по номеру srand(time(NULL));, когда ваша программа запускается.

srand устанавливает семена в функцию rand. Давая ему возвращаемое значение time(NULL) помогает получать разные семена при каждом запуске программы.

Как вы отметили свой вопрос как C++, вы можете использовать функцию C++ 11 для обработки чисел random.

+0

Ваше предложение сработало. Тем не менее, все пять файлов теперь имеют одно и то же имя: s – Matthew

+1

какие файлы (вы говорите)? – tomahh

1

femtoRgon прав , Это семя программу, но взгляните на новый C Стандарт ++, как они улучшили генерации случайных чисел см

Random numbers in C++0x

1

рэнд не совсем случайное число, а псевдослучайной один, что просто " выглядит «случайным, если вы не знаете алгоритм, используемый для генерации значений. От человека страницы:

Рандов() возвращает псевдослучайное целое число в диапазоне от 0 до RAND_MAX включительно

псевдослучайных означает, что данные один и тот же входной сигнал, называемое семя, его даст тот же результат. Это действительно полезно, когда вы пытаетесь отладить проблему, так как будут возвращены те же «случайные» значения, что позволит вам воспроизвести проблему. Плохо, если вам действительно нужна случайность.

Как отмечалось выше, путем изменения семени на что-то другое в каждом прогоне, например секунд секунд с эпохи, вы можете получать разные значения из своего вызова в rand().

srand(time(NULL)) 

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

Смежные вопросы