Как устроен модуль random в python под капотом?
Какой исходный код, по которому создаются псевдослучайные числа, от чего зависит их случайность в python 3.x?
Вроде как есть способ их создания с помощью температура процессора.
Находил данный код, но по нему не пройтись дебагером, чтобы понять логику генерации чисел
P.S.
Учитывая, что питон написан на C, то мб и реализацию нужно смотреть на C?
Ответы (2 шт):
Судя по коду на Github, существует класс Random, который используется для создания экземпляров, чтобы получить независимые генераторы. Также имеется возможность использовать его подклассы, если необходимо использовать собственный генератор (в этом случае можно переопределить методы random(), seed(), getstate(), setstate()). seed() используется для того чтобы указать свое "зерно" псевдорандомизации, которое является исходными данными для формулы. Зерном может быть к примеру системное время в миллисекундах в настоящий момент времени, которое будет соответственно всегда меняться. Вообще сам модуль random содержит множество функций, связанных с эмуляцией случайности (перемешивание элементов последовательности и т.д.)
Обычно алгоритмы генерации (псевдо) случайных чисел основаны на получении каждого следующего числа на основе предыдущего (предыдущих) с помощью какой-то хитрой функции. При этом начальное значение зависит от какого-то "зерна" (seed), которое как раз инициализируется каким-то "гарантированно" случайным числом, типа температуры или текущего времени, а дальнейшие числа генерируются фактически детерменированно (не случайно) - если установить одно и то же начальное зерно, то после его установки будет генерироваться одна и та же последовательность значений.
Конкретно по поводу реализации в Python, нужно смотреть сишный модуль _randommodule.c, и в начальных комментариях указано, что код основан на http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html , где в заголовке указано, что это вариант алгоритма Вихрь Мерсенна (Mersenne Twister). Общее описание этого алгоритма можно почитать например на Википедии: Вихрь Мерсенна.