Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Использовать не rand(); вместо этого используйте новые объекты С++ 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;
    }
}

P.S.

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

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

Ответ 4

Попробуйте переместить семя srand вне цикла так:

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

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

Ответ 5

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

    srand (time(NULL));
    (int t=0;t<10;t++)
    {
    cout << rand() % 100 << endl;
    } 

Ответ 6

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

Ответ 7

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

Ответ 8

Вам нужно извлечь инициализацию 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;
}

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

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

}

Ответ 12

/*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)));

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

Ответ 13

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

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

Ответ 14

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

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