random seed что такое
Краеугольный камень псевдослучайности: с чего начинается поиск чисел
(с)
Случайные числа постоянно генерируются каждой машиной, которая может обмениваться данными. И даже если она не обменивается данными, каждый компьютер нуждается в случайности для распределения программ в памяти. При этом, конечно, компьютер, как детерминированная система, не может создавать истинные случайные числа.
Когда речь заходит о генераторах случайных (или псевдослучайных) чисел, рассказ всегда строится вокруг поиска истинной случайности. Пока серьезные математики десятилетиями ведут дискуссии о том, что считать случайностью, в практическом отношении мы давно научились использовать «правильную» энтропию. Впрочем, «шум» — это лишь вершина айсберга.
С чего начать, если мы хотим распутать клубок самых сильных алгоритмов PRNG и TRNG? На самом деле, с какими бы алгоритмами вы не имели дело, все сводится к трем китам: seed, таблица предопределенных констант и математические формулы.
Каким бы ни был seed, еще есть алгоритмы, участвующие в генераторах истинных случайных чисел, и такие алгоритмы никогда не бывают случайными.
Что такое случайность
Первое подходящее определение случайной последовательности дал в 1966 году шведский статистик Пер Мартин-Лёф, ученик одного из крупнейших математиков XX века Андрея Колмогорова. Ранее исследователи пытались определить случайную последовательность как последовательность, которая проходила все тесты на случайность.
Основная идея Мартина-Лёфа заключалась в том, чтобы использовать теорию вычислимости для формального определения понятия теста случайности. Это контрастирует с идеей случайности в вероятности; в этой теории ни один конкретный элемент пространства выборки не может быть назван случайным.
«Случайная последовательность» в представлениях Мартина-Лёфа должна быть типичной, т.е. не должна обладать индивидуальными отличительными особенностями.
Было показано, что случайность Мартина-Лёфа допускает много эквивалентных характеристик, каждая из которых удовлетворяет нашему интуитивному представлению о свойствах, которые должны иметь случайные последовательности:
Существование множественных определений рандомизации Мартина-Лёфа и устойчивость этих определений при разных моделях вычислений свидетельствуют о том, что случайность Мартина-Лёфа является фундаментальным свойством математики.
Seed: основа псевдослучайных алгоритмов
Первые алгоритмы формирования случайных чисел выполняли ряд основных арифметических действий: умножить, разделить, добавить, вычесть, взять средние числа и т.д. Сегодня такие мощные алгоритмы, как Fortuna и Yarrow (используется в FreeBSD, AIX, Mac OS X, NetBSD) выглядят как генераторы случайных чисел для параноиков. Fortuna, например, это криптографический генератор, в котором для защиты от дискредитации после выполнения каждого запроса на случайные данные в размере 220 байт генерируются еще 256 бит псевдослучайных данных и используются в качестве нового ключа шифрования — старый ключ при этом каждый раз уничтожается.
Прошли годы, прежде чем простейшие алгоритмы эволюционировали до криптографически стойких генераторов псевдослучайных чисел. Частично этот процесс можно проследить на примере работы одной математической функции в языке С.
Функция rand () является простейшей из функций генерации случайных чисел в C.
В этом примере рандома используется вложенный цикл для отображения 100 случайных значений. Функция rand () хороша при создании множества случайных значений, но они являются предсказуемыми. Чтобы сделать вывод менее предсказуемым, вам нужно добавить seed в генератор случайных чисел — это делается с помощью функции srand ().
Seed — это стартовое число, точка, с которой начинается последовательность псевдослучайных чисел. Генератор псевдослучайных чисел использует единственное начальное значение, откуда и следует его псевдослучайность. Генератор истинных случайных чисел всегда имеет в начале высококачественную случайную величину, предоставленную различными источниками энтропии.
srand() принимает число и ставит его в качестве отправной точки. Если seed не выставить, то при каждом запуске программы мы будем получать одинаковые случайные числа.
Вот пример простой формулы случайного числа из «классики» — книги «Язык программирования C» Кернигана и Ричи, первое издание которой вышло аж в 1978 году:
Эта формула предполагает существование переменной, называемой random_seed, изначально заданной некоторым числом. Переменная random_seed умножается на 1 103 535 245, а затем 12 345 добавляется к результату; random_seed затем заменяется этим новым значением. Это на самом деле довольно хороший генератор псевдослучайных чисел. Если вы используете его для создания случайных чисел от 0 до 9, то первые 20 значений, которые он вернет при seed = 10, будут такими:
Если у вас есть 10 000 значений от 0 до 9, то распределение будет следующим:
0 — 10151 — 10242 — 10483 — 9964 — 9885 — 10016 — 9967 — 10068 — 9659 — 961
Любая формула псевдослучайных чисел зависит от начального значения. Если вы предоставите функции rand() seed 10 на одном компьютере, и посмотрите на поток чисел, которые она производит, то результат будет идентичен «случайной последовательности», созданной на любом другом компьютере с seed 10.
К сожалению, у генератора случайных чисел есть и другая слабость: вы всегда можете предсказать, что будет дальше, основываясь на том, что было раньше. Чтобы получить следующее число в последовательности, мы должны всегда помнить последнее внутреннее состояние генератора — так называемый state. Без state мы будем снова делать одну и ту же математическую операцию с одинаковыми числами, чтобы получить тот же ответ.
Как сделать seed уникальным для каждого случая? Самое очевидное решение — добавить в вычисления текущее системное время. Сделать это можно с помощью функции time().
Функция time() возвращает информацию о текущем времени суток, значение, которое постоянно изменяется. При этом метод typecasting гарантирует, что значение, возвращаемое функцией time(), является целым числом.
Итак, в результате добавления «случайного» системного времени функция rand() генерирует значения, которые являются более случайными, чем мы получили в первом примере.
Однако в этом случае seed можно угадать, зная системное время или время запуска приложения. Как правило, для приложений, где случайные числа являются абсолютно критичными, лучше всего найти альтернативное решение.
Но опять же, все эти числа не случайны.
Лучшее, что вы можете сделать с детерминированными генераторами псевдослучайных чисел — добавить энтропию физических явлений.
Период (цикл) генератора
Одними из наиболее часто используемых методов генерации псевдослучайных чисел являются различные модификации линейного конгруэнтного метода, схема которого была предложена Дерриком Лемером еще в 1949 году:
Рассмотрим случай, когда seed равен 1, а период — 100 (на языке Haskell):
В результате мы получим следующий ответ:
Это лишь пример и подобную структуру в реальной жизни не используют. В Haskell, если вы хотите построить случайную последовательность, можно воспользоваться следующим кодом:
Выбор случайного Int дает вам обратно Int и новый StdGen, который вы можете использовать для получения более псевдослучайных чисел. Многие языки программирования, включая Haskell, имеют генераторы случайных чисел, которые автоматически запоминают свое состояние (в Haskell это randomIO).
Чем больше величина периода, тем выше надежность создания хороших случайных значений, однако даже с миллиардами циклов крайне важно использовать надежный seed. Реальные генераторы случайных чисел обычно используют атмосферный шум (поставьте сюда любое физическое явление — от движения мыши пользователя до радиоактивного распада), но мы можем и схитрить программным методом, добавив в seed асинхронные потоки различного мусора, будь то длины интервалов между последними heartbeat потоками или временем ожидания mutual exclusion (а лучше добавить все вместе).
Истинная случайность бит
Итак, получив seed с примесью данных от реальных физических явлений (либо максимально усложнив жизнь будущему взломщику самым большим набором потоков программного мусора, который только сможем придумать), установив state для защиты от ошибки повтора значений и добавив криптографических алгоритмов (или сложных математических задач), мы получим некоторый набор данных, который будем считать случайной последовательностью. Что дальше?
Дальше мы возвращаемся к самому началу, к одному из фундаментальных требований — тестам.
Национальный институт стандартов и технологий США вложил в «Пакет статистических тестов для случайных и псевдослучайных генераторов чисел для криптографических приложений» 15 базовых проверок. Ими можно и ограничиться, но этот пакет вовсе не является «вершиной» проверки случайности.
Одни из самых строгих статистических тестов предложил профессор Джордж Марсалья из Университета штата Флорида. «Тесты diehard» включают 17 различных проверок, некоторые из них требуют очень длинных последовательностей: минимум 268 мегабайт.
Случайность можно проверить с помощью библиотеки TestU01, представленной Пьером Л’Экуйе и Ричардом Симардом из Монреальского университета, включающей классические тесты и некоторые оригинальные, а также посредством общедоступной библиотеки SPRNG.
Еще один полезный сервис для количественного измерения случайности.
Python: Как использовать метод random.seed()
Функция random() в Python используется для генерации псевдослучайных чисел. Он генерирует числа для некоторых значений, называемых seed значением.
Как работает функция seed?
Функция начального числа используется для хранения случайного метода генерации одних и тех же случайных чисел при многократном выполнении кода на одной или разных машинах.
Начальное значение имеет важное значение для компьютерной безопасности, поскольку оно псевдослучайно создает безопасный секретный ключ шифрования. Таким образом, используя настраиваемое начальное значение, вы можете инициализировать безопасный генератор псевдослучайных чисел в нужном вам месте.
Python random seed
Функция random.seed() в Python используется для инициализации случайных чисел. По умолчанию генератор случайных чисел использует текущее системное время. Если вы дважды используете одно и то же начальное значение, вы получите один и тот же результат, что означает случайное число дважды.
Синтаксис
Параметры
Пример
Этот пример демонстрирует, что если вы дважды используете одно и то же начальное значение, вы дважды получите одно и то же случайное число.
Давайте посмотрим на другой пример, в котором мы генерируем одно и то же случайное число много раз.
Когда мы передаем определенное начальное число в генератор случайных чисел, каждый раз, когда вы выполняете программу, вы получаете одни и те же числа. Это полезно, когда вам нужен предсказуемый источник случайных чисел.
Это упрощает оптимизацию кодов, когда для тестирования используются случайные числа. Вывод кода иногда зависит от ввода. Поэтому использование случайных чисел для тестирования алгоритмов может быть проблематичным.
Кроме того, функция seed используется для генерации одних и тех же случайных чисел снова и снова и упрощает процесс тестирования алгоритма.
Python Random.seed () – глубокое погружение
Введение Случайный – это встроенный модуль в Python, который генерирует псевдослучайные числа. Теперь случайные данные, сгенерированные этим модулем, не совсем случайно. Вместо этого он является псевдо-случайным, как упоминалось ранее. 📚 ПРИМЕЧАНИЕ. «Истинное случайное число» может быть сгенерировано Trng (истинным генератором случайных чисел), когда создается «псевдослучайное число» … Python Random.seed () – Deep Dive Подробнее »
Вступление
Случайные это встроенный модуль в Python, который генерирует псевдослучайная числа. Теперь случайные данные, сгенерированные этим модулем, не совсем случайно. Вместо этого он является псевдо-случайным, как упоминалось ранее.
📚 Примечание: А «Истинное случайный номер» может быть сгенерирован Trng (истинный генератор случайных номеров) во время A «Псевдослучайное число» генерируется PRNG (Pseudorandom Number Generator).
⚠️ Trng находится за пределами объема обсуждения в этой статье.
Итак, Что такое PRNG (генератор номера псевдоранда)? 🧐.
Случайные Модуль имеет набор методов, которые помогают нам генерировать случайные элементы (числа). В этом руководстве мы будем сосредоточиться на Семя () Метод Случайные модуль Отказ
🖋️ Случайное семя () Метод в Python
Генератор случайных номеров нуждается в начальной точке, то есть, она нуждается в Значение семян начать генерацию последовательности случайных чисел. Таким образом, это Семя () Метод, который используется для инициализации генератора случайных чисел.
🚀 По умолчанию Текущее системное время используется генератором случайного номера в качестве начальной точки. Чтобы настроить начальный номер генератора случайного номера, вы должны использовать Семя () метод.
🖋️ Как генерировать одно и то же случайное целое число каждый раз?
Если вы установите одинаковую Семя Значение перед вызовом любой функции случайных модулей, вы получите одно и то же число несколько раз.
Объяснение: В вышеуказанном выходе мы получили тот же номер, что и вывод, потому что одинаковое семя было установлено перед использованием Рэннт каждый раз.
🌱 Сравниваемые () и Random.Choice ()
Вы можете использовать пользовательское значение семян, чтобы получить значение одного и того же выбора снова и снова. Давайте посмотрим на следующий пример.
случайность.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() метод с тем же аргументом приведет к тому же псевдослучайному результату:
вот мое понимание. Каждый раз, когда мы устанавливаем начальное значение, генерируется «метка» или «ссылка». Следующий случайный.вызов функции прикрепляется к этой «метке», поэтому в следующий раз вы вызываете то же самое начальное значение и случайное.функция, это даст вам тот же результат.
Random Python
Каждый человек ежедневно сталкивается со случайностью. Википедия нам говорит: случайность — это результат маловероятного или непредсказуемого события. Непредсказуемого. Стоит отметить, что, чем сложнее система, тем ниже возможность прогнозировать (предсказывать) её будущие состояния. Мир сложен и именно по-этому случайность встречается столь часто. Можно сказать, что случайностью мы называем все события, которые не можем предугадать. Таким образом, разговор о случайном – это разговор о нехватке информации. Но эту нехватку человек научился использовать себе на пользу. К примеру, случайные величина широко применяются в криптографии.
В языке Python есть удобные инструменты для работы со случайными значениями. Речь о модуле стандартной библиотеки под названием random (и не только о нём). Давайте знакомиться!
Как использовать модуль random в Python
Для начала модуль надо импортировать.
Python функции модуля random
Случайное целое число — randint() функция random
Самое частое применение данного модуля — генерация случайных чисел. Самая популярная функция для этого — randint().
Она возвращает случайное целое число, лежащее в диапазоне, указанном в параметрах функции. Оба аргумента обязательны и должны быть целыми числами.
Генерация случайного целого числа — randrange()
Функция randrange() используется для генерации случайного целого числа в пределах заданного диапазона. Отличие от randint() заключается в том, что здесь есть третий параметр – шаг, по умолчанию равный единице.
Выбор случайного элемента из списка choice()
Вы играли в детстве в «считалочки»? Эники-беники… Вот этим и занимается random.choice(): функция возвращает один случайный элемент последовательности.
Функция sample()
random.sample() применяется, когда надо выбрать несколько элементов из заданной коллекции. Она возвращает список уникальных элементов, выбранных из исходной последовательности. Количество элементов, которое вернёт функция, задаётся аргументом k.
Случайные элементы из списка — choices()
random.choices делает то же, что и random.sample(), но элементы, которые она возвращает, могут быть не уникальными.
Генератор псевдослучайных чисел — seed()
Метод seed() используется для инициализации генератора псевдослучайных чисел в Python. Вот что это означает: для генерации псевдослучайных чисел необходимо какое-то исходное число и именно это число можно установить данным методом. Если значение seed не установлено, тогда система будет отталкиваться от текущего времени.
Перемешивание данных — shuffle()
Метод random.shuffle() применяется для расстановки элементов последовательности в случайном порядке. Представьте коробку в которой лежат какие-то предметы. Встряхните её 🙂
Генерации числа с плавающей запятой — uniform()
random.uniform() похожа на randint(), но применяется для генерации числа с плавающей запятой в указанном диапазоне.
Функция triangular()
Функция random.triangular() позволяет управлять вероятностью – она возвращает случайное число с плавающей запятой, которое соответствует заданному диапазону, а также уточняющему значению mode. Этот параметр дает возможность взвешивать возможный результат ближе к одному из двух других значений параметров. По умолчанию он находится посередине диапазона.
Криптографическая зашита генератора случайных данных
Случайные числа, полученные при помощи модуля random в Питоне, не являются криптографически устойчивыми. Это означает, что криптоанализ позволяет предсказать какое число будет сгенерировано следующим. Попробуем исправить ситуацию.
Его зачастую следует использовать вместо генератора псевдослучайных чисел по умолчанию в модуле random, который предназначен для моделирования и симуляции, а не безопасности или криптографии.
Numpy.random — Генератор псевдослучайных чисел
Самый простой способ задать массив со случайными элементами — использовать функцию sample (или random, или random_sample, или ranf — это всё одна и та же функция).
Без аргументов возвращает просто число в промежутке [0, 1), с одним целым числом — одномерный массив, с кортежем — массив с размерами, указанными в кортеже (все числа — из промежутка [0, 1)).
Генерация случайного n-мерного массива вещественных чисел
numpy.random.rand()применяется для генерации массива случайных вещественных чисел в пределах заданного диапазона.
Также можно генерировать числа согласно различным распределениям (Гаусса, Парето и другие). Чаще всего нужно равномерное распределение, которое можно получить с помощь функции uniform.
Для начала необходимо установить Numpy.
Генерация случайного n-мерного массива целых чисел
С помощью функции randint или random_integers можно создать массив из целых чисел. Аргументы: low, high, size: от какого, до какого числа (randint не включает в себя это число, а random_integers включает), и size — размеры массива.
Выбор случайного элемента из массива чисел или последовательности
Функция NumPy random.choice() используется для получения случайных выборок одномерного массива, который возвращается как случайные выборки массива NumPy. Эта функция генерирует случайные выборки, которые обычно используются в статистике данных, анализе данных, полях, связанных с данными, а также может использоваться в машинном обучении, байесовской статистике и т. д.
Генерация случайных универсальных уникальных ID
Универсальные уникальные идентификаторы, также известные как UUID, — это 128-битные числа, используемые для однозначной идентификации информации в компьютерных системах. UUID могут использоваться для обозначения широкого спектра элементов, включая документы, объекты, сеансы, токены, сущности и т. Д. Их также можно использовать в качестве ключей базы данных.
Эта библиотека генерирует уникальные идентификаторы на основе системного времени и сетевого адреса компьютера. Объект UUID неизменяем и содержит некоторые функции для создания различных уникальных идентификаторов.
UUID состоит из пяти компонентов, каждый из которых имеет фиксированную длину. Символ дефиса разделяет каждый компонент. Мы можем представить UUID в формате «8-4-4-4-12», где каждая из цифр представляет длину в шестнадцатеричном формате.
UUID Python, сгенерированный с помощью функции uuid4(), создается с использованием истинно случайного или псевдослучайного генератора. Поэтому вероятность повторения двух гуидов невелика. Когда UUID необходимо сгенерировать на отдельных машинах или мы хотим сгенерировать безопасные UUID, используйте UUID4 (). Он также используется для генерации криптографически безопасных случайных чисел.