c++ - это - генератор случайных чисел си




Как сгенерировать разные случайные числа в цикле в C++? (8)

Можно ли генерировать разные случайные числа, каждый цикл цикла. Например, у меня есть:

for (int t=0;t<10;t++)
{
    int random_x;
    srand ( time(NULL) );
    random_x = rand() % 100;
    cout<<"\nRandom X = "<<random_x;
} 

Но проблема в том, что каждый раз генерирует одинаковое случайное число. Можно ли генерировать разные случайные числа каждый цикл цикла?

Есть ли возможность перезагрузить случайную инициализацию чисел?


Вам нужно извлечь инициализацию time () из цикла for.

Вот пример, который будет выводиться в ожидаемом (ahah) случайном числе в консоли Windows.

#include <iostream>
#include <windows.h>
#include "time.h"
int main(int argc, char*argv[])
{
    srand ( time(NULL) );
    for (int t = 0; t < 10; t++)
    {
        int random_x;

        random_x = rand() % 100;
        std::cout << "\nRandom X = " << random_x << std::endl;
    }
    Sleep(50000);
    return 0;
}

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

Переместите вызов srand() за пределы цикла (и вызовите его только один раз, в начале вашего приложения), и вы должны получить случайные «случайные» номера.


Остановите посев генератора каждый раз. Вытяните вызов srand из цикла


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


Функция времени, вероятно, возвращает одно и то же значение во время каждой итерации цикла.

Попробуйте инициализировать случайное семя перед циклом.


Не знаю мужчин. Я нашел лучший способ для меня после тестирования разных способов, таких как 10 минут. (Измените номера в коде, чтобы получить большое или маленькое случайное число.)

    int x;
srand ( time(NULL) );
x = rand() % 1000 * rand() % 10000 ;
cout<<x;

Если у вас раннее участие в программе, вы можете умножить переменную цикла на время - чтобы обеспечить лучшее распространение. Например

for (int t = 0; t < 10; t++){
        srand(time(NULL)*t);
        random =  rand() % GetScreenWidth();

}

Не используйте rand() ; вместо этого используйте новые объекты C ++ 11 (например, std::mt19937 , std::uniform_int_distribution и т. д.).

Вы можете использовать такой код ( живите здесь, на Ideone ):

#include <iostream>
#include <random>
using namespace std;

int main()
{
    // Random seed
    random_device rd;

    // Initialize Mersenne Twister pseudo-random number generator
    mt19937 gen(rd());

    // Generate pseudo-random numbers
    // uniformly distributed in range (1, 100)
    uniform_int_distribution<> dis(1, 100);

    // Generate ten pseudo-random numbers
    for (int i = 0; i < 10; i++)
    {
        int randomX = dis(gen);
        cout << "\nRandom X = " << randomX;
    }
}

PS

Рассмотрите возможность просмотра этого видео с конференции Going Native 2013 для получения более подробной информации о связанных с rand() проблемах:

Ранд () считается вредным







random