Вопрос:
Можно ли генерировать разные случайные числа, каждый цикл цикла. Например, у меня есть:
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():
Ответ №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;