Random seed что это
Python Random.seed () – глубокое погружение
Введение Случайный – это встроенный модуль в Python, который генерирует псевдослучайные числа. Теперь случайные данные, сгенерированные этим модулем, не совсем случайно. Вместо этого он является псевдо-случайным, как упоминалось ранее. 📚 ПРИМЕЧАНИЕ. «Истинное случайное число» может быть сгенерировано Trng (истинным генератором случайных чисел), когда создается «псевдослучайное число» … Python Random.seed () – Deep Dive Подробнее »
Вступление
Случайные это встроенный модуль в Python, который генерирует псевдослучайная числа. Теперь случайные данные, сгенерированные этим модулем, не совсем случайно. Вместо этого он является псевдо-случайным, как упоминалось ранее.
📚 Примечание: А «Истинное случайный номер» может быть сгенерирован Trng (истинный генератор случайных номеров) во время A «Псевдослучайное число» генерируется PRNG (Pseudorandom Number Generator).
⚠️ Trng находится за пределами объема обсуждения в этой статье.
Итак, Что такое PRNG (генератор номера псевдоранда)? 🧐.
Случайные Модуль имеет набор методов, которые помогают нам генерировать случайные элементы (числа). В этом руководстве мы будем сосредоточиться на Семя () Метод Случайные модуль Отказ
🖋️ Случайное семя () Метод в Python
Генератор случайных номеров нуждается в начальной точке, то есть, она нуждается в Значение семян начать генерацию последовательности случайных чисел. Таким образом, это Семя () Метод, который используется для инициализации генератора случайных чисел.
🚀 По умолчанию Текущее системное время используется генератором случайного номера в качестве начальной точки. Чтобы настроить начальный номер генератора случайного номера, вы должны использовать Семя () метод.
🖋️ Как генерировать одно и то же случайное целое число каждый раз?
Если вы установите одинаковую Семя Значение перед вызовом любой функции случайных модулей, вы получите одно и то же число несколько раз.
Объяснение: В вышеуказанном выходе мы получили тот же номер, что и вывод, потому что одинаковое семя было установлено перед использованием Рэннт каждый раз.
🌱 Сравниваемые () и Random.Choice ()
Вы можете использовать пользовательское значение семян, чтобы получить значение одного и того же выбора снова и снова. Давайте посмотрим на следующий пример.
Python: Как использовать метод random.seed()
Функция random() в Python используется для генерации псевдослучайных чисел. Он генерирует числа для некоторых значений, называемых seed значением.
Как работает функция seed?
Функция начального числа используется для хранения случайного метода генерации одних и тех же случайных чисел при многократном выполнении кода на одной или разных машинах.
Начальное значение имеет важное значение для компьютерной безопасности, поскольку оно псевдослучайно создает безопасный секретный ключ шифрования. Таким образом, используя настраиваемое начальное значение, вы можете инициализировать безопасный генератор псевдослучайных чисел в нужном вам месте.
Python random seed
Функция random.seed() в Python используется для инициализации случайных чисел. По умолчанию генератор случайных чисел использует текущее системное время. Если вы дважды используете одно и то же начальное значение, вы получите один и тот же результат, что означает случайное число дважды.
Синтаксис
Параметры
Пример
Этот пример демонстрирует, что если вы дважды используете одно и то же начальное значение, вы дважды получите одно и то же случайное число.
Давайте посмотрим на другой пример, в котором мы генерируем одно и то же случайное число много раз.
Когда мы передаем определенное начальное число в генератор случайных чисел, каждый раз, когда вы выполняете программу, вы получаете одни и те же числа. Это полезно, когда вам нужен предсказуемый источник случайных чисел.
Это упрощает оптимизацию кодов, когда для тестирования используются случайные числа. Вывод кода иногда зависит от ввода. Поэтому использование случайных чисел для тестирования алгоритмов может быть проблематичным.
Кроме того, функция seed используется для генерации одних и тех же случайных чисел снова и снова и упрощает процесс тестирования алгоритма.
Безопасность случайных чисел в Python
Эта статья – вторая в ряде публикаций, посвященных уязвимостям генераторов псевдослучайных чисел (ГПСЧ).
В последнее время появился целый ряд публикаций, описывающих уязвимости ГПСЧ, начиная от самых основ ([1]) и заканчивая непосредственно уязвимостями в различных языках программирования и реализованных на их основе CMS и другого ПО ([2],[3],[4]).
Эти публикации популярны по той причине, что ГПСЧ – основа многих аспектов безопасности веб-приложений. Псевдослучайные числа/последовательности символов используются для обеспечения безопасности веб-приложений в:
Сейчас мы рассмотрим ГПСЧ в веб-приложениях, разработанных на языке Python.
Особенности ГПСЧ языка Python
В Python существует три модуля, предназначенных для генерации случайных/псевдослучайных чисел: random, urandom и _random:
RANDOM()
Первая использует алгоритм MT (модуль _random), однако прежде всего пытается инициализировать его с помощью SEED, взятого из urandom, что превращает ГПСЧ в ГСЧ (генератор случайных чисел). Если вызвать urandom не удается (например, отсутствует /dev/urandom или не удается вызвать нужную функцию из библиотеки advapi32.dll), то в качестве SEED используется int(time.time() * 256) (что, как вы уже знаете, обеспечивает недостаточную энтропию).
SYSTEMRANDOM()
SystemRandom() вызывает модуль urandom, который использует внешние источники для генерации случайных данных.
Изменения в реализации алгоритма MT заключается в том, что вместо одного числа, основанного на одном из 624 чисел из текущего состояния ГПСЧ (state), используются два числа:
Так же, в отличие от PHP, инициализировать генератор можно не только с помощью long-переменной, но и с помощью любой последовательности байт (происходит вызов init_by_array()), что и происходит при импорте модуля random с помощью внешнего источника энтропии (берется 32 байта из urandom), а в случае, когда это не удается, используется time():
Защита
Казалось бы, данные изменения, в отличие от PHP, обеспечивают достаточную энтропию генератора даже при вызове random.random(). Но не все так «плохо».
Особенностью фреймворков под Python является то, что в отличие от PHP, Python запускается один раз вместе с веб-сервером, а значит, инициализация состояния по умолчанию происходит один раз при выполнении команды import random или при принудительном вызове random.seed() (это крайне редкий случай для веб-приложений), что позволяет провести атаку на состояния MT по следующему алгоритму:
Далее с помощью запросов 1,2,199,200 можно определить состояния state_1[1], state_1[2], state_1[3], state_1[397], state_1[398], на основе которых генерируются состояния state_2[1] и state_2[2], из которых и получается случайное число запроса №313. Однако, энтропия этого числа составляет 2^24 (16M). Энтропия сокращается с помощью запросов 511 и 625. Эти запросы помогают вычислить состояния state_2[397], state_3[1]. Это уменьшает количество вариантов состояний до 2^8, т.е. существует всего 256 вариантов «случайного» числа, используемого в запросе №313.
Необходимым условием выполнения атаки является то, что никто не вклинится в процессе запросов, тем самым не повлияв на смену состояния ГПСЧ (другими словами, что индексы состояний будут определены правильно). Также необходимо чтобы запрос №1 использовал элементы состояния ГПСЧ с индексами не больше 224, иначе запрос №200 будет использовать другое состояние генератора, что не позволит выполнить ангоритм. Вероятность этого события составляет 36%.
Поэтому дополнительная задача запроса №625 – определить, что все предыдущие запросы действительно производились в нужных состояниях и никто не вклинился в процесс запросов.
В дополнение предлагаем вашему вниманию сценарий, который получает на вход случайные числа 6-ти запросов. На выходе формируются все возможные случайные числа запроса №313.
Практическое применение
Мы проанализировали несколько фреймворков и веб-приложений на языке Python (среди них Plone и Django). К сожалению, (а может быть и к счастью) найти среди них уязвимые не удалось.
Самым вероятным претендентом является Plone, так как в нем есть вывод случайного числа (SiteErrorLog.py) но проблема атаки на него в следующем. Plone работает под Python 2.7.*, который при выводе float в str() обрезает последние 5 цифр, что расширяет количество перебираемых вариантов (и при локальном переборе, и при внешних запросах к серверу) до очень больших чисел.
Python третьей ветки не обрезает float в функции st()r, что делает приложения на нем главными претендентами для проведения атак.
Мы предлагаем вашему вниманию сценарий, который получает на входе 6 случайных чисел (проинициализированных состоянием с нужными индексами, например, из тестового сценария vuln.py), а на выходе генерирует возможные варианты подбираемого случайного числа. Время работы этого сценария на среднестатистическом компьютере – около часа.
Примечание: данный сценарий не учитывает возможную погрешность определения элемента состояния для (i mod 2 = 1), поэтому эффективность снижается с 36% до 18%.
Заключение
Особенности выполнения кода фреймворков на Python (на стороне веб-сервера) позволяют злоумышленнику проводить атаки, невозможные или очень труднореализуемые в языке PHP. Для защиты ГПСЧ необходимо соблюдать простые правила:
случайность.seed (): что он делает?
Я немного запутался в том, что random.seed() делает в Python. Например, почему нижеприведенные испытания делают то, что они делают (последовательно)?
Я не могу найти хорошую документацию по этому. Заранее спасибо!
10 ответов:
генераторы псевдослучайных чисел работают, выполняя некоторую операцию над значением. Обычно это значение является предыдущим числом, генерируемым генератором. Однако при первом использовании генератора Предыдущее значение отсутствует.
заполнение генератора псевдослучайных чисел дает ему первое «Предыдущее» значение. Каждое начальное значение будет соответствовать последовательности сгенерированных значений для заданного генератора случайных чисел. То есть, если вы предоставляете одно и то же семя дважды, вы получаете то же самое последовательность чисел дважды.
Как правило, вы хотите заполнить свой генератор случайных чисел с некоторым значением, которое будет изменять каждое выполнение программы. Например, текущее время является часто используемым семян. Причина, по которой это не происходит автоматически, заключается в том, что если вы хотите, вы можете предоставить определенное семя, чтобы получить известную последовательность чисел.
все остальные ответы, похоже, не объясняют использование random.семя.)( Вот простой пример (источник):
попробуйте это. Скажем так: «случайно.семя ‘ дает значение генератору случайных величин (‘random.randint ()’), который генерирует эти значения на основе этого семени. Одним из обязательных свойств случайных чисел является то, что они должны быть воспроизводимыми. Как только вы положите одно и то же семя, вы получите тот же шаблон случайных чисел. Так вы создаете их с самого начала снова. Вы даете другое семя, оно начинается с другого инициала (выше 3).
вы дали семя теперь это будет генерировать случайные числа между 1 и 10 один за другим. Таким образом, вы можете принять один набор чисел для одного начального значения.
в этом случае random на самом деле является псевдослучайным. Учитывая семя, оно будет генерировать числа с равным распределением. Но с тем же семенем, он будет генерировать ту же последовательность чисел каждый раз. Если вы хотите, чтобы это изменилось, вам придется изменить свое семя. Многие люди любят генерировать семя на основе текущего времени или что-то в этом роде.
выполните вышеуказанную программу несколько раз.
1-я попытка: выводит 5 случайных целых чисел в диапазоне от 1 до 100
2-я попытка: печатает те же 5 случайных чисел, которые появились в приведенном выше исполнении.
3-я попытка: то же самое
следовательно, установка seed в 10 в следующем выполнении снова устанавливает ссылочный номер в 10 и снова начинается то же самое поведение.
Как только мы сбрасываем значение семян дает растения.
Примечание: измените начальное значение и запустите программу,вы увидите другую случайную последовательность, чем предыдущая.
Imho, он используется для генерации же случайный результат курса, когда вы используете random.seed(samedigit) снова.
случайное число генерируется некоторой операцией над предыдущим значением.
если нет предыдущего значения, то текущее время как Предыдущее значение автоматически. мы можем предоставить это Предыдущее значение самостоятельно с помощью random.seed(x) где x может быть любое число или строка и т. д.
import random random.seed(45) #seed=45
random.random() #1st rand value=0.2718754143840908 0.2718754143840908
random.random() #2nd rand value=0.48802820785090784 0.48802820785090784
random.seed(45) # again reasign seed=45
random.random() 0.2718754143840908 #matching with 1st rand value
random.random() 0.48802820785090784 #matching with 2nd rand value
вот небольшой тест, который показывает, что кормление seed() метод с тем же аргументом приведет к тому же псевдослучайному результату:
вот мое понимание. Каждый раз, когда мы устанавливаем начальное значение, генерируется «метка» или «ссылка». Следующий случайный.вызов функции прикрепляется к этой «метке», поэтому в следующий раз вы вызываете то же самое начальное значение и случайное.функция, это даст вам тот же результат.
Python 3: Генерация случайных чисел (модуль random)¶
«Генерация случайных чисел слишком важна, чтобы оставлять её на волю случая»
Python порождает случайные числа на основе формулы, так что они не на самом деле случайные, а, как говорят, псевдослучайные [1]. Этот способ удобен для большинства приложений (кроме онлайновых казино) [2].
[1] | Википедия: Генератор псевдослучайных чисел |
[2] | Доусон М. Программируем на Python. — СПб.: Питер, 2014. — 416 с.: ил. — 3-е изд |
Модуль random позволяет генерировать случайные числа. Прежде чем использовать модуль, необходимо подключить его с помощью инструкции:
random.random¶
random.random() — возвращает псевдослучайное число от 0.0 до 1.0
random.seed¶
random.seed( ) — настраивает генератор случайных чисел на новую последовательность. По умолчанию используется системное время. Если значение параметра будет одиноким, то генерируется одинокое число:
random.uniform¶
random.randint¶
random.choince¶
random.choince( ) — возвращает случайный элемент из любой последовательности (строки, списка, кортежа):
random.randrange¶
random.shuffle¶
random.shuffle( ) — перемешивает последовательность (изменяется сама последовательность). Поэтому функция не работает для неизменяемых объектов.
Вероятностные распределения¶
random.expovariate(lambd) — экспоненциальное распределение. lambd равен 1/среднее желаемое. Lambd должен быть отличным от нуля. Возвращаемые значения от 0 до плюс бесконечности, если lambd положительно, и от минус бесконечности до 0, если lambd отрицательный.
random.gauss(значение, стандартное отклонение) — распределение Гаусса.
random.normalvariate(mu, sigma) — нормальное распределение. mu — среднее значение, sigma — стандартное отклонение.
random.vonmisesvariate(mu, kappa) — mu — средний угол, выраженный в радианах от 0 до 2π, и kappa — параметр концентрации, который должен быть больше или равен нулю. Если каппа равна нулю, это распределение сводится к случайному углу в диапазоне от 0 до 2π.
random.paretovariate(alpha) — распределение Парето.
random.weibullvariate(alpha, beta) — распределение Вейбулла.
Примеры¶
Генерация произвольного пароля¶
Хороший пароль должен быть произвольным и состоять минимум из 6 символов, в нём должны быть цифры, строчные и прописные буквы. Приготовить такой пароль можно по следующему рецепту:
Этот же скрипт можно записать всего в две строки:
Данная команда является краткой записью цикла for, вместо неё можно было написать так:
Данный цикл повторяется 12 раз и на каждом круге добавляет к строке psw произвольно выбранный элемент из списка.