2015-03-25 4 views
-1

Привет, У меня возникли проблемы с генератором случайных чисел, которые дают мне одну и ту же последовательность (последовательность отличается от числа) при каждом запуске. Вот упрощенная лаконичность кода, чтобы продемонстрировать мою проблему.Генератор случайных чисел C++, вызываемый несколько раз

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
using namespace std; 
int random(){ 
    srand(time(0)); 
    return(1+rand() % 6); 
} 
int main(){ 
    cout<< random() <<endl; 
    cout<< random() <<endl; 
} // will return a repeated double digit i.e. 11, 22, 33, 44 
+2

То же самое начальное -> та же последовательность чисел. Ваша программа засевает его, затем получает число, затем снова семена (с тем же семенем), затем получает тот же номер. – immibis

+4

Переместите это: 'srand (time (0));' вверху 'main()'. Это один раз для каждого процесса, если вы не намеренно сеяете (и по внешнему виду, это не так). – WhozCraig

+0

Когда я семя его снова, разве семена не меняются, потому что время другое? – user3743825

ответ

0

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

А также последующие вызовы rand() будут автоматически генерировать разные номера. например

while (1){ 
    printf("%d ",rand()%100); 
} 

напечатает список номеров, которые все разные, например. 5 34 65 23 56 ...

ПЕРЕД тем, как вы его реализуете, обратите внимание на обновления time(NULL) один раз в секунду. Вместо этого в int main(){ добавьте srand(time(NULL)); один раз в начале.

Удачи вам!

+0

'NULL' - это то же самое, что и' 0'. – Julian

+0

ждать, правда? хорошо остальные рекомендации. редактирование ... – Thornkey

+2

'В C++ определение NULL равно 0, поэтому существует только эстетическая разница. ... Еще одна проблема с NULL заключается в том, что люди иногда ошибочно полагают, что она отличается от 0 и/или не целой. »- [Bjarne Stroustrup] (http://www.stroustrup.com/bs_faq2.html#null). – Julian

2

rand() является «псевдослучайным» генератором. Это означает, что он использует математическую функцию для генерации следующего значения из предыдущего.

srand() устанавливает начальное значение «seed» для последующих вызовов «rand()». Если вы засеиваете одно и то же значение, вы получите такую ​​же случайную последовательность. Если вы засеете его текущим временем, последовательность будет отличаться каждую секунду.

Вызов только один раз:

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
using namespace std; 
int random(){ 
    return(1+rand() % 6); 
} 

int main(){ 
    srand(time(0)); 

    cout<< random() <<endl; 
    cout<< random() <<endl; 
} 
Смежные вопросы