Различные реализации с одним и тем же случайным семенем - PullRequest
0 голосов
/ 22 января 2011

У меня есть проект с разными модулями. Затем у меня есть файл с именем Main.py, в котором есть код, который вызывает эти модули во время выполнения. В файле Main.py я установил случайное начальное число, используя:

random.seed(2)

Вывод, который я получаю из разных прогонов, не идентичен, даже если я использую одно и то же случайное начальное число. Не могли бы вы сказать мне, почему это может происходить? Различные модули в моем классе используют функции random.uniform, random.choice, random.sample. В одном месте я также определяю rnduniform = random.uniform и использую это.

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

Спасибо.

РЕДАКТИРОВАТЬ: Решено. Моя ошибка.

Извините, что потратил ваше время. Я более внимательно посмотрел на код, и одна из функций, использующих генерацию случайных чисел, была вызвана в методе init одного из классов. Метод init был доступен до того, как было задано начальное число. Я пытался удалить пост, но не смог. Следовательно, это редактирование.

1 Ответ

1 голос
/ 22 января 2011

Потоковая безопасность имеет дело с параллельным программированием - или, другими словами, когда вы выполняете два разных пути кода одновременно, используя потоки.Поскольку что-то, что может быть для вас как для программиста одной строкой кода, обычно представляет собой множество отдельных действий, другой поток может мешать работе любых переменных, которые вы используете, или использовать промежуточные вычисления.Это очень затруднит понимание ошибок, потому что обычно ваш код будет казаться полностью нормальным.

В этом случае он говорит, что ваш код использует random() и другой код в потоке, который каким-то образом использует случайное числогенератор может конфликтовать и вести себя не так, как ожидалось.Например, числа могут больше не быть математически случайными, или если вы инициализируете с определенным базовым начальным числом, а затем ожидаете, что random() вернет количество установленных значений для нескольких вызовов, эти числа могут быть не теми, которые вы ожидаетевернулся.В самом худшем случае использования не поточно-ориентированных функций вы можете столкнуться с резкими исключениями и / или сбоями, поскольку функция не предназначена для одновременного использования в нескольких потоках.

Также см.тема Википедии о безопасности потоков .

...