Использование qsrand, случайный метод, который не случаен

У меня есть странная проблема здесь, и мне не может удаться найти хорошее объяснение к ней, таким образом, я думал о выяснении у Вас парни:

Рассмотрите следующий метод:

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 каждый раз, но только однажды в течение времени жизни моего приложения, он работает отлично...

Мой вопрос: Почему?

18
задан Andy M 4 May 2010 в 17:11
поделиться

3 ответа

Потому что если вы вызываете randomize более одного раза в миллисекунду (что довольно вероятно при нынешней тактовой частоте процессора), вы засеваете RNG одним и тем же значением. Это гарантированно приводит к одинаковому результату работы ГСЧ.

Генераторы случайных чисел предназначены только для однократного засева. Засевание их несколько раз не делает вывод более случайным, и фактически (как вы обнаружили) может сделать его гораздо менее случайным.

36
ответ дан 30 November 2019 в 06:59
поделиться

То, что вы видите, - это эффект псевдослучайности. Вы засеваете время один раз, и он генерирует последовательность чисел. Поскольку вы извлекаете серию случайных чисел очень быстро друг за другом, вы повторно засеваете рандомизатор одним и тем же числом до следующей миллисекунды. И хотя миллисекунда кажется коротким промежутком времени, подумайте о том, сколько вычислений вы делаете за это время.

1
ответ дан 30 November 2019 в 06:59
поделиться

Если вы сделаете вызов достаточно быстро, значение QTime::currentTime().msec() не изменится, и вы, по сути, повторно засеете qsrand тем же самым семенем, в результате чего следующее сгенерированное случайное число будет таким же, как предыдущее.

2
ответ дан 30 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: