Как генерировать различный случайный набор чисел, каждый раз в рамках одной и той же программы / функции? - PullRequest
2 голосов
/ 06 августа 2010

Я понимаю, что использование srand (time (0)) помогает в установке случайного начального числа. Однако следующий код сохраняет один и тот же набор чисел для двух разных списков.

Интересно, как сгенерировать другой набор чисел, когда следующая функция вызывается более одного раза?

void storeRandomNos(std::list<int>& dataToStore)
{

    int noofElements = 0;
    srand(time(0));


    noofElements = (rand() % 14 ) + 1;

    while ( noofElements --)
    {
        dataToStore.push_back(rand() % 20 + 1 );
    }
}

Вот остаток кода.

void printList(const std::list<int>& dataElements, const char* msg);
void storeRandomNos(std::list<int>& dataToStore);
int main()
{
    std::list<int> numberColl1;
    std::list<int> numberColl2;


    storeRandomNos(numberColl1);
    storeRandomNos(numberColl2);

    printList(numberColl1 , "List1");
    printList(numberColl2 , "Second list");


}


void printList(const std::list<int>& dataElements, const char* msg)
{

    std::cout << msg << std::endl;
    std::list<int>::const_iterator curLoc = dataElements.begin();

    for ( ; curLoc != dataElements.end() ; ++curLoc)
    {
        std::cout << *curLoc << ' ';
    }
}

Ответы [ 4 ]

8 голосов
/ 06 августа 2010

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

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

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

Как говорили другие комментаторы, необходимо только один раз ввести довольно случайное значение (т. Е. Текущее время).

6 голосов
/ 06 августа 2010

Инициализируйте ГСЧ только один раз, когда запускается основная программа.Не каждый раз, когда вы вступаете в свои функции.В противном случае есть вероятность, что функция вызывается дважды в течение одной секунды, что может дать вам идентичные результаты для time(0).

2 голосов
/ 06 августа 2010

сделайте srand(time(0)) один раз в начале вашей программы.

0 голосов
/ 06 августа 2010

Вам нужно использовать srand(time(0)) только один раз в каждом потоке , который вызывает rand() в вашей программе, чтобы получить псевдослучайные числа.

...