Ответ 1
Не используйте srand
внутри цикла, используйте его только один раз, например. в начале main()
. И srand()
- это именно то, как вы reset это.
Можно ли генерировать разные случайные числа, каждый цикл цикла. Например, у меня есть:
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 это.
Вы получаете одно и то же случайное число каждый раз, потому что вы устанавливаете семя внутри цикла. Даже если вы используете time()
, он меняется только один раз в секунду, поэтому, если ваш цикл завершается через секунду (что, скорее всего, будет), вы получите одно и то же начальное значение каждый раз и одно и то же начальное случайное число.
Переместите вызов srand()
за пределы цикла (и вызовите его только один раз, в начале вашего приложения), и вы должны получить случайные "случайные" номера.
Использовать не 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()
:
Попробуйте переместить семя 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 в комментарии, перемещение семени за пределы цикла поможет только в том случае, если цикл не находится в функции, которую вы вызываете несколько раз.
У меня была такая же проблема в течение нескольких дней. Сохранение srand() из цикла равно+. Кроме того, не назначайте rand()% 100 любой переменной. Просто cout rand()% 100 в цикле. Попробуйте следующее:
srand (time(NULL));
(int t=0;t<10;t++)
{
cout << rand() % 100 << endl;
}
Остановить посев генератора каждый раз. Вытяните вызов srand из цикла
Переместите вызов srand
в начало программы. Поскольку у вас есть это сейчас, время может быть одинаковым между двумя последовательными вызовами, поэтому генератор случайных чисел начнет снова в том же месте.
Вам нужно извлечь инициализацию 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;
}
Функция времени, вероятно, возвращает одно и то же значение во время каждой итерации цикла.
Попробуйте инициализировать случайное семя перед циклом.
На каждой итерации вы возвращаете последовательность псевдослучайных чисел, потому что вы вызываете srand
с тем же самым семенем (так как вызов time
настолько частый). Либо используйте другое семя, либо вызовите srand
один раз, прежде чем вводить цикл.
Если у вас есть рандомы на ранней стадии в программе, вы можете умножить переменную цикла на время - чтобы обеспечить лучшее распределение. Например
for (int t = 0; t < 10; t++){
srand(time(NULL)*t);
random = rand() % GetScreenWidth();
}
/*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-массиве после некоторых изменений. Любые предложения по поводу кода приветствуются.
Функция rand()
работает так, что каждый раз, когда вы вызываете ее, она генерирует случайное число. В своем коде вы вызвали его один раз и сохранили в переменную random_x
. Чтобы получить желаемые случайные числа вместо того, чтобы сохранять их в переменной, просто вызовите функцию следующим образом:
for (int t=0;t<10;t++)
{
cout << "\nRandom X = " << rand() % 100;
}
Не знаю мужчин. Я нашел лучший способ для меня после тестирования разных способов, таких как 10 минут. (Измените номера в коде, чтобы получить большое или маленькое случайное число.)
int x;
srand ( time(NULL) );
x = rand() % 1000 * rand() % 10000 ;
cout<<x;