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

Вопрос:Можно ли генерировать разные случайные числа, каждый цикл цикла. Например, у меня есть: for (int t=0;t

Вопрос:

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

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

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

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

Лучший ответ:

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

Ответ №1

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

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

Ответ №2

Использовать не 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() считается вредным

Ответ №3

Попробуйте переместить семя 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 в комментарии, перемещение семени за пределы цикла поможет только в том случае, если цикл не находится в функции, которую вы вызываете несколько раз.

Ответ №4

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

srand (time(NULL)); (int t=0;t<10;t++) { cout << rand() % 100 << endl; } Ответ №5

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

Ответ №6

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

Ответ №7

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

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

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

Ответ №9

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

Ответ №10

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

for (int t = 0; t < 10; t++){ srand(time(NULL)*t); random = rand() % GetScreenWidth(); } Ответ №11/*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<<«nn»; 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-массиве после некоторых изменений.
Любые предложения по поводу кода приветствуются.

Ответ №12

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

for (int t=0;t<10;t++) { cout << «nRandom X = » << rand() % 100; } Ответ №13

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

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

Оцените статью
Добавить комментарий