Как генерировать разные случайные числа в цикле в C ++? - PullRequest
19 голосов
/ 08 февраля 2011

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

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

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

Есть ли возможность сброса инициализации случайных чисел?

Ответы [ 13 ]

26 голосов
/ 08 февраля 2011

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

16 голосов
/ 08 февраля 2011

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

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

8 голосов
/ 15 апреля 2015

Do not use 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() проблемах:

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

3 голосов
/ 08 февраля 2011

Попробуйте переместить семя srand за пределы цикла следующим образом:

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

Как говорит Марк Рэнсом в комментарии, перемещение начального числа вне цикла поможет, только если цикл не находится в функции, которую вы вызываете несколько раз.

1 голос
/ 16 ноября 2013

У меня была такая же проблема в течение нескольких дней. Хранение srand () вне цикла - это +. Кроме того, не назначайте rand ()% 100 любой переменной. Просто cout rand ()% 100 в цикле. Попробуйте это:

    srand (time(NULL));
    (int t=0;t<10;t++)
    {
    cout << rand() % 100 << endl;
    } 
0 голосов
/ 07 октября 2017
/*this code is written in Turbo C++
 For Visual Studio, code is in comment*/

int a[10],ct=0,x=10,y=10;    //x,y can be any value, but within the range of 
                             //array declared
randomize();                 //there is no need to use this Visual Studio
for(int i=0;i<10;i++)
{   a[i]=random(10);         //use a[i]=rand()%10 for Visual Studio
}
cout<<"\n\n";
do
{   ct=0;
    for(i=0;i<x;i++)
    {   for(int j=0;j<y;j++)
        {   if(a[i]==a[j]&&i!=j)
            {   a[j]=random(10);    //use a[i]=rand()%10 for Visual Studio
            }
            else
            {   ct++;
            }
        }
    }
}while(!(ct==(x*y)));

Ну, я не профессионал в C ++, но узнал об этом в школе. Я использую этот алгоритм в течение прошлого года для хранения различных случайных значений в одномерном массиве, но это также будет работать в двумерном массиве после некоторых изменений. Любые предложения по коду приветствуются.

0 голосов
/ 15 апреля 2015

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

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

}
0 голосов
/ 19 июля 2013

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

    int x;
srand ( time(NULL) );
x = rand() % 1000 * rand() % 10000 ;
cout<<x;
0 голосов
/ 08 февраля 2011

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

0 голосов
/ 08 февраля 2011

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

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

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