Random number generator

Функции управления генератором

random.seed(a=None, version=2)Инициализирует (запускает) генератор случайных чисел.Если не задан или , используется текущее системное время. Если источники случайности предоставляются операционной системой, они используются вместо системного времени (см. функцию для получения подробной информации).Используется значение , если оно (целое число).

Копировать

При (по умолчанию), объекты , , или преобразуются в и все его биты используются.

При (для воспроизведения случайных последовательностей из более старых версий Python), алгоритм для и вырабатывает более узкий диапазон посева.

random.getstate()Возвращает объект, фиксирующий текущее внутреннее состояние генератора. Этот объект может быть передан в для возобновления состояния.

Копировать

random.setstate(state) должен быть получен из предыдущего вызова. И восстановит внутреннее состояние генератора до такого, которое было получено из вызова .

random.getrandbits(k)Возвращает Python со случайными битами . Этот метод поставляется вместе с генератором MersenneTwister, в то время как другие генераторы могут также предоставлять его как необязательную часть API.

Копировать

При возможности, включает для обработки диапазонов величины.

Примеры

Чтобы воспользоваться возможностями генерации случайных чисел в Python 3, следует произвести импорт библиотеки random, вынеся ее в начало исполняемого файла при помощи ключевого слова import.

Вещественные числа

В модуле есть одноименная функция random. В Python она используется чаще, чем другие функции этого модуля. Функция возвращает вещественное число в промежутке от 0 до 1. В следующем примере демонстрируется создание трех разных переменных a, b и c.

import random
a = random.random()
b = random.random()
print(a)
print(b)

0.547933286519
0.456436031781

Целые числа

Для получения случайных целых чисел в определенном диапазоне используется функция randint, принимающая два аргумента: минимальное и максимальное значение. Программа, показанная ниже отображает генерацию трех разных значений в промежутке от 0 до 9.

import random
a = random.randint(0, 9)
b = random.randint(0, 9)
print(a)
print(b)

4
7

Диапазоны целых

Метод randrange позволяет генерировать целочисленные значения, благодаря работе с тремя параметрами: минимальная и максимальная величина, а также длина шага. Вызвав функцию с одним аргументом, начальная граница получит значение 0, а интервал станет равен 1. Для двух аргументов автоматически инициализируется только длина шага. Работа данного метода с трема разными наборами параметров показана в следующем примере.

import random
a = random.randrange(10)
b = random.randrange(2, 10)
c = random.randrange(2, 10, 2)
print(a)
print(b)
print(c)

9
5
2

Диапазоны вещественных

Сгенерировать вещественное число поможет метод под названием uniform. Он принимает всего два аргумента, обозначающих минимальное и максимальное значения. Демонстрация его работы располагается в следующем примере кода, где создаются переменные a, b и c.

import random
a = random.uniform(0, 10)
b = random.uniform(0, 10)
print(a)
print(b)

4.85687375091
3.66695202551

Использование в генераторах

Возможности генерации псевдослучайных чисел можно использовать и для создания последовательностей. В следующем фрагменте кода создается набор чисел при помощи генератора списка со случайным наполнением и длиной. Как можно заметить, в данном примере функция randint вызывается дважды: для каждого элемента и размера списка.

import random
a = 
print(a)

Перемешивание

Метод shuffle дает возможность перемешать содержимое уже созданного списка. Таким образом, все его элементы будут находиться в абсолютно случайном порядке. Пример, где отображается работа этой функции со списком a из 10 значений, располагается дальше.

import random
a = 
random.shuffle(a)
print(a)

Случайный элемент списка

При помощи функции choice можно извлечь случайный элемент из существующего набора данных. В следующем примере переменная b получает некое целое число из списка a.

import random
a = 
b = random.choice(a)
print(b)

7

Несколько элементов списка

Извлечь из последовательности данных можно не только один элемент, но и целый набор значений. Функция sample позволит получить абсолютно новый список чисел из случайных компонентов уже существующего списка. В качестве первого аргумента необходимо ввести исходную последовательность, а на месте второго указать желаемую длину нового массива.

import random
a = 
a = random.sample(a, 5)
print(a)

Генерация букв

Возможности стандартной библиотеки позволяют генерировать не только числа, но и буквы. В следующем примере показывается инициализация трех разных переменных случайными символами латиницы. Для этого необходимо произвести импортирование модуля string, а затем воспользоваться списком letters, который включает все буквы английского алфавита.

import random
import string
a = random.choice(string.letters)
b = random.choice(string.letters)
c = random.choice(string.letters)
print(a)
print(b)
print(c)

J
i
L

Как можно заметить, отображаются буквы в разном регистре. Для того чтобы преобразовать их к общему виду, рекомендуется вызвать стандартные строковые методы upper или lower.

SystemRandom

Как уже говорилось ранее, SystemRandom основана на os.urandom. Она выдает так же псевдослучайные данные, но они зависят дополнительно и от операционной системы. Результаты используются в криптографии. Есть недостаток — то что функции SystemRandom отрабатывают в несколько раз дольше. Рассмотрим пример использования:

import random
sr = random.SystemRandom()
a = sr.random()
b = sr.randint(0, 9)
c = sr.randrange(2, 10, 2)
print(a)
print(b)
print(c)

0.36012464614815465
2
8

Что такое случайные числа?

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

Стоит заметить, что стандартные средства Python не способны предоставлять в программе истинно случайные значения. Они предоставляют псевдо случайную последовательность. Инициализируется она от какого либо случайного числа. То есть если мы будем инициализировать последовательность одним и тем же числом, то она будет каждый раз выдавать одинаковые данные. Чтобы этого не было, для инициализации берется значение системных часов.

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

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

Реализации случайных чисел в Python

Язык программирования Python содержит в себе несколько разных модулей, применяемых для генерации псевдослучайных величин. Все они, как правило, используют в своих целях текущее системное время, которое установлено на компьютере. Это гарантирует получение разных последовательностей значений при каждом новом обращении к генератору. Среди инструментов, которые предназначены для работы с псевдослучайными числами, находится довольно обширная библиотека random, а также функции numpy.random и os.urandom.

Особенности их применения:

  • Стандартный модуль random в Python 3 включает множество методов для генерации как целых, так и вещественных чисел, а также последовательностей с определенными параметрами.
  • Функция numpy.random используется для заполнения массивов случайными величинами.
  • Функция os.urandom предоставляет набор из случайных байтов, что применимо в криптографии.

В модуле random есть класс SystemRandom, внутри реализации которого идет обращение как раз к os.urandom. В этом альтернативном генераторе реализованы те же функции, но их уже можно применять в криптографии.

Наиболее широкое применение получила в Python библиотека random. Поэтому далее мы ее и рассмотрим подробно.

Функции для последовательностей

random.choice(seq)Возвращает случайный элемент из непустой последовательности . Если пуст, возникает ошибка .

Копировать

random.choices(population, weights=None, *, cum_weights=None, k=1)Возвращает список элементов размером , выбранных из с заменой. Если пуст, возникает ошибка .

Копировать

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

Например, относительный вес эквивалентны кумулятивному весу . Внутренне относительные веса преобразуются в кумулятивные перед выбором, поэтому поставка кумулятивного веса экономит время.

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

или могут использовать любой тип чисел, который взаимодействует со значением , возвращаемым функцией (который включает целые числа, числа с плавающей точкой и фракции, но исключает десятичные числа).

random.shuffle(x)Перемешивает последовательность на месте.Необязательный аргумент — функция 0-аргумента, возвращающая случайное значение float в ; по умолчанию это функция .

Копировать

Чтобы перемешать неизменяемую последовательность и вернуть новый перемешанный список, используйте .

Обратите внимание, что даже для небольшого общее количество перестановок может увеличиваться сильнее, чем период большинства генераторов случайных чисел.Это означает, что большинство перестановок длинной последовательности никогда не могут быть выполнены. Например, последовательность длиной 2080 элементов является самой большой, которая может вписываться в период генератора случайных чисел «Мерсин Твистер»

random.sample(population, k)Возвращает список длиной из уникальных элементов, выбранных из последовательности или множества. Используется для случайной выборки без замены.

Копировать

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

Это позволяет победителям розыгрышей (при выборке) делиться на главный приз, второе место и далее.

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

Что бы выбрать одно число из ряда чисел, используйте объект в качестве аргумента. Это простое решение для выборки из большой последовательности: .

Если размер выборки больше длины последовательности, возникает ошибка .

How to Use the RNG?

There are five kinds of input types and they can be grouped into two main categories.

2.1. First Input Type (Range)

The wheel will produce a list of numbers based on the Min, Max and Interval values.

  1. Write the Min, Max and the Interval values. There are only up to 1000 (Desktop/Tablet) or 500 (Mobile) portions allowed.

  2. The wheel will be updated with the latest inputs
  3. Click the spin button to start spinning the random number wheel.

  4. The random number is produced and displayed on a dialog.
  5. Choose one of the action modes towards the result.

  6. The result is then stored in the history.

  7. Choose to shuffle the available inputs of random number generator .

  8. Change the spin behavior, sound, confetti and color settings at Tool Settings section.

2.2. Second to Fifth Input Type (Spin and Combine)

It spins and displays digit by digit. All the digits are combined together in the end to form a final number.

  1. Pick the desired number of digits (at the input type) you want to show.
  2. Click the Spin button to start spinning.

  3. The digit result from each spin is displayed on these boards. You can tap on the board to spin that particular digit.

  4. Enable the automatically spinning by toggling this button, else you have to spin the digit one by one manually.

  5. You can reset the digits by clicking this reset button.

Класс Random

В Java есть специальный класс , который инкапсулирует в себе последовательность псевдослучайных чисел. Можно создать несколько объектов класса , и каждый из этих объектов будет генерировать свою последовательность псевдослучайных чисел.

Это очень интересный класс, и у него есть много интересных методов. Начнем с самых простых:

Метод

Этот метод возвращает случайное вещественное число в диапазоне – . Очень похоже на метод . И ничего удивительного, ведь метод просто вызывает метод у объекта типа .

Метод

Метод очень похож на метод , только возвращаемое случайное число типа . Оно также лежит в диапазоне – . И, как всегда, в Java диапазон не включает число .

Метод

Этот метод возвращает случайное целое число в диапазоне . входит в диапазон, — не входит.

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

Метод

Этот метод аналогичен предыдущему, но не принимает никаких параметров. Тогда в каком же диапазоне он выдает числа? От до .

Ну или если точнее, от до .

Метод

Этот метод аналогичен методу , только возвращаемое значение будет из всего возможного диапазона значений типа .

Метод

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

Метод

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

Метод

Этот метод возвращает случайное вещественное число в диапазоне — . Вот только числа в этом диапазоне распределены не равномерно, а подчиняются нормальному распределению.

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

Пик значений в нашем случае придется на

Примеры использования модуля random.

Базовое применение модуля:

>>> import random
# Случайное float:  0.0 <= x < 1.0
>>> random.random()
# 0.37444887175646646

# Случайное float:  2.5 <= x < 10.0
>>> random.uniform(2.5, 10.0)
# 3.1800146073117523

# Интервал между прибытием в среднем 5 секунд
>>> random.expovariate(1  5)
# 5.148957571865031

# Четное целое число от 0 до 100 включительно
>>> random.randrange(10)
# 7

# Even integer from 0 to 100 inclusive
>>> random.randrange(, 101, 2)
26

# Один случайный элемент из последовательности
>>> random.choice()
'draw'

>>> deck = 'ace two three four'.split()
# Перемешать список
>>> random.shuffle(deck)
>>> deck
'four', 'two', 'ace', 'three'

# Четыре образца без замены
>>> random.sample(, k=4)
# 

Имитационные расчеты:

# Шесть вращений колеса рулетки (взвешенная выборка с заменой)
>>> choices(, 18, 18, 2], k=6)
# 

# Сдайте 20 карт без замены из колоды из 52 игральных карт
# и определите пропорцию карт с достоинством в: 
# десять, валет, дама или король.
>>> dealt = sample(, counts=16, 36], k=20)
>>> dealt.count('tens')  20
# 0.15

# Оценка вероятности получения 5 или более попаданий из 7 
# бросаний монеты, которая выпадает орлом в 60% случаев.
>>> def trial():
...     return choices('HT', cum_weights=(0.60, 1.00), k=7).count('H') >= 5
...
>>> sum(trial() for i in range(10_000))  10_000
# 0.4169

>>> # Вероятность того, что медиана из 5 выборок находится в средних двух квартилях
>>> def trial():
...     return 2_500 <= sorted(choices(range(10_000), k=5))[2 < 7_500
...
>>> sum(trial() for i in range(10_000))  10_000
# 0.7958

Пример статистической начальной загрузки с использованием повторной выборки с заменой для оценки доверительного интервала для среднего значения выборки:

# http://statistics.about.com/od/Applications/a/Example-Of-Bootstrapping.htm
from statistics import fmean as mean
from random import choices

data = 41, 50, 29, 37, 81, 30, 73, 63, 20, 35, 68, 22, 60, 31, 95
means = sorted(mean(choices(data, k=len(data))) for i in range(100))
print(f'The sample mean of {mean(data).1f} has a 90% confidence '
      f'interval from {means5.1f} to {means94.1f}')

Пример теста перестановки повторной выборки для определения статистической значимости или Р-значения наблюдаемой разницы между эффектами препарата и плацебо:

# Example from "Statistics is Easy" by Dennis Shasha and Manda Wilson
from statistics import fmean as mean
from random import shuffle

drug = 54, 73, 53, 70, 73, 68, 52, 65, 65
placebo = 54, 51, 58, 44, 55, 52, 42, 47, 58, 46
observed_diff = mean(drug) - mean(placebo)

n = 10_000
count = 
combined = drug + placebo
for i in range(n):
    shuffle(combined)
    new_diff = mean(combined) - mean(combinedlen(drug):])
    count += (new_diff >= observed_diff)

print(f'{n} label reshufflings produced only {count} instances with a difference')
print(f'at least as extreme as the observed difference of {observed_diff.1f}.')
print(f'The one-sided p-value of {count  n.4f} leads us to reject the null')
print(f'hypothesis that there is no difference between the drug and the placebo.')

Моделирование времени прибытия и доставки услуг для многосерверной очереди:

from heapq import heappush, heappop
from random import expovariate, gauss
from statistics import mean, median, stdev

average_arrival_interval = 5.6
average_service_time = 15.0
stdev_service_time = 3.5
num_servers = 3

waits = []
arrival_time = 0.0
servers = 0.0 * num_servers  # time when each server becomes available
for i in range(100_000):
    arrival_time += expovariate(1.0  average_arrival_interval)
    next_server_available = heappop(servers)
    wait = max(0.0, next_server_available - arrival_time)
    waits.append(wait)
    service_duration = gauss(average_service_time, stdev_service_time)
    service_completed = arrival_time + wait + service_duration
    heappush(servers, service_completed)

print(f'Mean wait: {mean(waits).1f}.  Stdev wait: {stdev(waits).1f}.')
print(f'Median wait: {median(waits).1f}.  Max wait: {max(waits).1f}.')

Собственная реализация

Лучшим решением будет сделать что-то простое, что занимает мало памяти и очень быстро работает.

В результате всех исследований и проведенных опытов, самым простым и быстрым вариантом стал — конгруэнтный мультипликативный алгоритм с модулем от числа 2^31.

Я не стал помещать класс в пространство имен, потому что считаю что то, что ниже — проблема архитектора, а не моя.

Генерацию seedá я сделал в нескольких вариациях:

  • Time — использует структуру и предоставляет достаточно надежное значение seedá, но аллоцирует 208 байт. Потому что (сюрприз) неуправляемая структура.

  • Guid — использует структуру и . Guid в отличии от работает медленнее, но аллоцирует всего 16 байт и является управляемой структурой (т.е. размещается на стеке и не копируется в кучу).

  • Crypto — использует и аллоцирует 4 байта. По скорости сравним с Guid, но данный метод не тестировался на разных платформах. Так же, пара простых строчек, может прибавить к размеру билда, если пространство имен раньше не входило в ваш билд.

Тестирование производительности

Кол-во аллокаций неуправляемых объектов проверялся таким образом:

Значения в таблице — среднее время затраченное на заполнение двумерного массива размерностью NxN:

Внизу:Кол-во итераций/размер двумерного массива

Справа: Тип используемого генератора

UnityEngine.Random (milliseconds)

System.Random (milliseconds)

FastRandom (milliseconds)

25/4096×4096

472

611

223

1000/1024×1024

28

43

15

Тестировалось на ноутбуке ASUS Zephyrus G15 в редакторе. Под разные платформы не компилировалось.

Как установить

Если версия Unity выше чем 2019.3 в файл Packages/manifest.json добавить:

Или просто скачать .unitypackage из раздел Releases

Types of Modes

For the range input type, two ßmodes are available in this rng for different use cases. For the spin and combine input types, there is only the normal mode available.

3.1. Normal Mode

If you have used core Picker Wheel before, this mode is similar. When you choose this mode for the result selected, it does not have side effect to the result.

Use Case 1

This rng can be used in a giftaway event. Where each of the gifts is assigned with a number. The eligible participant is able to spin the wheel to pick a number in order to get his/her gift.

Use Case 2

Teachers can use the default 10 value spinner to teach their students about the numbers. By using the wheel, the learning process will be more interesting.

3.2. Elimination Mode

This mode is again similar to original Picker Wheel’s elimination mode. The difference is it will permanently remove the result selected from the wheel if you select this mode.

Use Case 3

This random number picker application can be used also in a giftaway event. Where each participants are holding a number themselves, the gifts will be given one by one based on the number generated by this RNG.

Игра в кости с использованием модуля random в Python

Далее представлен код простой игры в кости, которая поможет понять принцип работы функций модуля random. В игре два участника и два кубика.

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

Код программы для игры в кости Python:

Python

import random

PlayerOne = «Анна»
PlayerTwo = «Алекс»

AnnaScore = 0
AlexScore = 0

# У каждого кубика шесть возможных значений
diceOne =
diceTwo =

def playDiceGame():
«»»Оба участника, Анна и Алекс, бросают кубик, используя метод shuffle»»»

for i in range(5):
#оба кубика встряхиваются 5 раз
random.shuffle(diceOne)
random.shuffle(diceTwo)
firstNumber = random.choice(diceOne) # использование метода choice для выбора случайного значения
SecondNumber = random.choice(diceTwo)
return firstNumber + SecondNumber

print(«Игра в кости использует модуль random\n»)

#Давайте сыграем в кости три раза
for i in range(3):
# определим, кто будет бросать кости первым
AlexTossNumber = random.randint(1, 100) # генерация случайного числа от 1 до 100, включая 100
AnnaTossNumber = random.randrange(1, 101, 1) # генерация случайного числа от 1 до 100, не включая 101

if( AlexTossNumber > AnnaTossNumber):
print(«Алекс выиграл жеребьевку.»)
AlexScore = playDiceGame()
AnnaScore = playDiceGame()
else:
print(«Анна выиграла жеребьевку.»)
AnnaScore = playDiceGame()
AlexScore = playDiceGame()

if(AlexScore > AnnaScore):
print («Алекс выиграл игру в кости. Финальный счет Алекса:», AlexScore, «Финальный счет Анны:», AnnaScore, «\n»)
else:
print(«Анна выиграла игру в кости. Финальный счет Анны:», AnnaScore, «Финальный счет Алекса:», AlexScore, «\n»)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

importrandom

PlayerOne=»Анна»

PlayerTwo=»Алекс»

AnnaScore=

AlexScore=

 
# У каждого кубика шесть возможных значений

diceOne=1,2,3,4,5,6

diceTwo=1,2,3,4,5,6

defplayDiceGame()

«»»Оба участника, Анна и Алекс, бросают кубик, используя метод shuffle»»»

foriinrange(5)

#оба кубика встряхиваются 5 раз

random.shuffle(diceOne)

random.shuffle(diceTwo)

firstNumber=random.choice(diceOne)# использование метода choice для выбора случайного значения

SecondNumber=random.choice(diceTwo)

returnfirstNumber+SecondNumber

print(«Игра в кости использует модуль random\n»)

 
#Давайте сыграем в кости три раза

foriinrange(3)

# определим, кто будет бросать кости первым

AlexTossNumber=random.randint(1,100)# генерация случайного числа от 1 до 100, включая 100

AnnaTossNumber=random.randrange(1,101,1)# генерация случайного числа от 1 до 100, не включая 101

if(AlexTossNumber>AnnaTossNumber)

print(«Алекс выиграл жеребьевку.»)

AlexScore=playDiceGame()

AnnaScore=playDiceGame()

else

print(«Анна выиграла жеребьевку.»)

AnnaScore=playDiceGame()

AlexScore=playDiceGame()

if(AlexScore>AnnaScore)

print(«Алекс выиграл игру в кости. Финальный счет Алекса:»,AlexScore,»Финальный счет Анны:»,AnnaScore,»\n»)

else

print(«Анна выиграла игру в кости. Финальный счет Анны:»,AnnaScore,»Финальный счет Алекса:»,AlexScore,»\n»)

Вывод:

Shell

Игра в кости использует модуль random

Анна выиграла жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 5 Финальный счет Алекса: 2

Анна выиграла жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 2

Алекс выиграл жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 8

1
2
3
4
5
6
7
8
9
10

Игравкостииспользуетмодульrandom

 
Аннавыигралажеребьевку.

Аннавыигралаигрувкости.ФинальныйсчетАнны5ФинальныйсчетАлекса2

 
Аннавыигралажеребьевку.

Аннавыигралаигрувкости.ФинальныйсчетАнны10ФинальныйсчетАлекса2

 
Алексвыигралжеребьевку.

Аннавыигралаигрувкости.ФинальныйсчетАнны10ФинальныйсчетАлекса8

Вот и все. Оставить комментарии можете в секции ниже.

Генерация случайных распределений и псевдослучайных чисел.

Модуль реализует генераторы псевдослучайных чисел для различных распределений.

Для целых чисел существует равномерный выбор из диапазона. Для последовательностей существует равномерный выбор случайного элемента, функция для генерации случайной перестановки списка на месте и функция для случайной выборки без замены.

На реальной линии есть функции для вычисления равномерного, нормального (гауссовского), логнормального, отрицательного экспоненциального, гамма и бета распределений. Для генерации распределений углов доступно распределение фон Мизеса.

Почти все функции модуля зависят от базовой функции , которая генерирует случайное число с плавающей точкой в ​​полуоткрытом диапазоне . Python использует Mersenne Twister в качестве генератора ядра. Он генерирует 53-битные значения точности и имеет период . Базовая реализация в C является быстрой и поточно-ориентированной. Mersenne Twister является одним из наиболее тщательно протестированных генераторов случайных чисел из существующих. Однако, будучи полностью детерминированным, он не подходит для всех целей и совершенно не подходит для криптографических целей.

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

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

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

Предупреждение.

Псевдослучайные генераторы этого модуля не должны использоваться в целях безопасности. В целях безопасности или криптографического использования смотрите «Модуль «.

Замечания по воспроизводимости последовательностей.

Иногда полезно иметь возможность воспроизвести последовательности, заданные генератором псевдослучайных чисел. При повторном использовании начального значения , одна и та же последовательность должна воспроизводиться от запуска к запуску, пока не запущено несколько потоков.

Большинство алгоритмов и функций модуля могут изменяться в разных версиях Python, но два аспекта гарантированно не изменятся:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector