2011-02-12 2 views
0

Можно создать дубликат:
how to generate different random number in a loop in C++?Почему этот код генерирует случайные числа, всегда вызывая одинаковые числа?

В этом коде:

int Randtest(int len) 
{ 
    int test[100]={}; 
    for(int i=0;i<len;i++) 
    { 
     srand (time(NULL)); 
     cout <<(test[i]=rand()%10); 
    } 
} 

int main() 
{ 
Randtest(8); 
} 

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

+2

Этот вопрос задан в миллион раз. Точный дубликат. – abelenky

ответ

6

Проблема с кодом здесь:

for(int i=0;i<len;i++) 
{ 
    srand (time(NULL)); 
    cout <<(test[i]=rand()%10); 
} 

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

Чтобы это исправить, переместите вызов srand из петли, как показано здесь:

srand (time(NULL)); 
for(int i=0;i<len;i++) 
{ 
    cout <<(test[i]=rand()%10); 
} 

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

+0

thnx для объяснения – Abanoub

0

Завершить повторное посев с одинаковым значением на каждой итерации цикла. Просто сделайте это в main.

2

srand запускает генератор случайных чисел в текущее время, заданное time(NULL).

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

Ответ: Использование srandРАЗ и только один раз, вне петля.

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