Кранд не генерирует случайное число - PullRequest
4 голосов
/ 29 июня 2010

У меня есть приложение QT, запущено еще 2 темы.

Внутри потоков я использую функцию qrand для генерации случайного числа. Ниже приведен код, используемый для получения числа, где m_fluctuations max является двойным.

int fluctuate =  qrand() % (int)(m_FluctuationMax * 100);

Я попытался добавить следующий код в основной поток, а также в классы потока.

QTime now = QTime::currentTime();
qsrand(now.msec());

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

Разве они не должны отличаться, поскольку начальное значение устанавливается функцией currentTime ().

Спасибо

Ответы [ 4 ]

8 голосов
/ 29 июня 2010

У меня был qsrand () в конструкторе потока / класса.Когда я переместил его в функцию run (), он начал работать случайным образом.Не уверен, почему это не будет работать от конструктора, хотя.Спасибо всем за помощь.

4 голосов
/ 17 апреля 2016

Это может помочь любому, кто столкнулся с подобной проблемой:

qsrand(static_cast<quint64>(QTime::currentTime().msecsSinceStartOfDay()));

array<int, 5> arr = {qrand(), qrand(), qrand(), qrand(), qrand()};

for(auto i : arr)
   cout << i << endl;
2 голосов
/ 29 июня 2010

У меня был qsrand () в конструкторе потока / класса. Когда я переместил его в функцию run (), он начал работать случайным образом. Не уверен, почему это не будет работать от конструктора, хотя.

qsrand() использует локальное хранилище потока для хранения начального числа, которое фактически является состоянием генератора псевдослучайных чисел, которое также обновляется при каждом вызове qrand(). Если вы засеяете PRNG вне потока, где вы будете его использовать, то это не повлияет на результат. Локальное хранилище потока по умолчанию обычно равно нулю, чтобы вы каждый раз получали одну и ту же последовательность псевдослучайных чисел, поскольку начальное число всегда одинаково.

2 голосов
/ 29 июня 2010

первая вещь, которую я проверю, это значение now.msec(). Возвращает только миллисекундную часть текущего времени и состояния документа:

Обратите внимание, что точность зависит от точности базовой операционной системы; не все системы обеспечивают точность в 1 миллисекунду.

Возможно, ваша платформа всегда возвращает одно и то же значение для msec(). Если это так, вы можете попытаться использовать минуты и секунды вместе (если вы не запускаете свой код несколько раз каждую секунду).

Вы не указали, на какой платформе вы работаете, но исходный код Qt поддерживает разрешение менее секунды, если установлено Q_OS_WIN или Q_OS_UNIX.


Имейте в виду, что случайные числа являются для каждого потока, поэтому вам, вероятно, следует выполнить qsrand in каждый поток, чтобы он не был автоматически заполнен 1.

...