У меня есть странная проблема здесь, и мне не может удаться найти хорошее объяснение к ней, таким образом, я думал о выяснении у Вас парни:
Рассмотрите следующий метод:
int MathUtility::randomize(int Min, int Max)
{
qsrand(QTime::currentTime().msec());
if (Min > Max)
{
int Temp = Min;
Min = Max;
Max = Temp;
}
return ((rand()%(Max-Min+1))+Min);
}
Я не объясню Вас гуру, что на самом деле делает этот метод, я вместо этого объясню свою проблему:
Я понял, что, когда я называю этот метод в цикле, иногда, я получаю то же случайное число много раз... Например, этот отрывок...
for(int i=0; i<10; ++i)
{
int Index = MathUtility::randomize(0, 1000);
qDebug() << Index;
}
... произведет что-то как:
567 567 567 567... и т.д...
Я понял также, что, если я не называю qsrand каждый раз, но только однажды в течение времени жизни моего приложения, он работает отлично...
Мой вопрос: Почему?
Потому что если вы вызываете randomize
более одного раза в миллисекунду (что довольно вероятно при нынешней тактовой частоте процессора), вы засеваете RNG одним и тем же значением. Это гарантированно приводит к одинаковому результату работы ГСЧ.
Генераторы случайных чисел предназначены только для однократного засева. Засевание их несколько раз не делает вывод более случайным, и фактически (как вы обнаружили) может сделать его гораздо менее случайным.
То, что вы видите, - это эффект псевдослучайности. Вы засеваете время один раз, и он генерирует последовательность чисел. Поскольку вы извлекаете серию случайных чисел очень быстро друг за другом, вы повторно засеваете рандомизатор одним и тем же числом до следующей миллисекунды. И хотя миллисекунда кажется коротким промежутком времени, подумайте о том, сколько вычислений вы делаете за это время.
Если вы сделаете вызов достаточно быстро, значение QTime::currentTime().msec()
не изменится, и вы, по сути, повторно засеете qsrand
тем же самым семенем, в результате чего следующее сгенерированное случайное число будет таким же, как предыдущее.