Генератор случайных чисел

Введение

Примеры

  • 4

    Случайные и последовательности: случайный выбор, выбор и выборка

     import random
    
     

    перетасовать ()

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

     laughs = ["Hi", "Ho", "He"]
    
    random.shuffle(laughs)     # Shuffles in-place! Don't do: laughs = random.shuffle(laughs)
    
    print(laughs)
    # Out: ["He", "Hi", "Ho"]  # Output may vary!
    
     

    выбор()

    Принимает случайный элемент из последовательности произвольном:

     print(random.choice(laughs))
    # Out: He                  # Output may vary!
    
     

    образец()

    Как choice он принимает случайные элементы из последовательности , но произвольной вы можете указать , сколько:

     #                   |--sequence--|--number--|
    print(random.sample(    laughs   ,     1    ))  # Take one element
    # Out: ['Ho']                    # Output may vary!
    
     

    он не будет принимать один и тот же элемент дважды:

     print(random.sample(laughs, 3))  # Take 3 random element from the sequence.
    # Out: ['Ho', 'He', 'Hi']        # Output may vary!
    
    print(random.sample(laughs, 4))  # Take 4 random element from the 3-item sequence.
     

    ValueError: выборка больше, чем совокупность

  • 4

    Создание случайных целых чисел и чисел: randint, randrange, random и равномерное

     import random
    
     

    randint ()

    Возвращает случайное число между x и y (включительно):

     random.randint(x, y)
    
     

    Например получать случайное число между 1 и 8 :

     random.randint(1, 8) # Out: 8
    
     

    randrange ()

    random.randrange имеет тот же синтаксис, что range и в отличие от random.randint , последнее значение не включено:

     random.randrange(100)       # Random integer between 0 and 99
    random.randrange(20, 50)    # Random integer between 20 and 49
    random.rangrange(10, 20, 3) # Random integer between 10 and 19 with step 3 (10, 13, 16 and 19)
    
    
    
     

    График случайного распределения

    случайный

    Возвращает случайное число с плавающей запятой от 0 до 1:

     random.random() # Out: 0.66486093215306317
    
     

    единообразный

    Возвращает случайное число с плавающей точкой между x и y (включительно):

     random.uniform(1, 8) # Out: 3.726062641730108
    
     
  • 3

    Воспроизводимые случайные числа: семя и состояние

    Установка определенного Семени создаст фиксированный ряд случайных чисел:

     random.seed(5)                 # Create a fixed state         
    print(random.randrange(0, 10))  # Get a random integer between 0 and 9
    # Out: 9
    print(random.randrange(0, 10))
    # Out: 4
    
     

    Сброс начального числа создаст ту же самую «случайную» последовательность снова:

     random.seed(5)                 # Reset the random module to the same fixed state.
    print(random.randrange(0, 10))
    # Out: 9
    print(random.randrange(0, 10))
    # Out: 4
    
     

    Так как семя фиксируется эти результаты всегда 9 и 4 . Если иметь конкретные номера не требуется , только то , что значения будут тем же, также можно просто использовать getstate и setstate для восстановления предыдущего состояния:

     save_state = random.getstate()  # Get the current state
    print(random.randrange(0, 10))
    # Out: 5
    print(random.randrange(0, 10))
    # Out: 8
    
    random.setstate(save_state)     # Reset to saved state
    print(random.randrange(0, 10))
    # Out: 5
    print(random.randrange(0, 10))
    # Out: 8
    
     

    Для псевдо-рандомизации последовательности вы снова seed с None :

     random.seed(None)
    
     

    Или вызовите seed метод без аргументов:

     random.seed() 
  • 4

    Создание криптографически безопасных случайных чисел

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

    Для создания криптографически защищенного псевдослучайного числа, можно использовать SystemRandom , которые, используя os.urandom , может выступать в качестве криптографической защиты генератора псевдослучайных чисел, CPRNG .

    Самый простой способ использовать это просто включает в себя инициализацию SystemRandom класса. Предоставленные методы аналогичны тем, которые экспортируются случайным модулем.

     from random import SystemRandom
    secure_rand_gen = SystemRandom()
    
     

    Для того чтобы создать случайную последовательность 10 int s в диапазоне [0, 20] , можно просто вызвать randrange() :

     print([secure_rand_gen.randrange(10) for i in range(10)])
    # [9, 6, 9, 2, 2, 3, 8, 0, 9, 9]
    
     

    Для того, чтобы создать случайное число в заданном диапазоне, можно использовать randint :

     print(secure_rand_gen.randint(0, 20))
    # 5
    
     

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

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

  • 6

    Создание случайного пароля пользователя

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

     from string import punctuation, ascii_letters, digits
    
     

    Затем мы можем объединить все эти символы в имени с именем symbols :

     symbols = ascii_letters + digits + punctuation
    
     

    Удалите любой из них, чтобы создать пул символов с меньшим количеством элементов.

    После этого, мы можем использовать random.SystemRandom для генерации пароля. Для пароля длиной 10:

     secure_random = random.SystemRandom()
    password = "".join(secure_random.choice(symbols) for i in range(10))
    print(password)  # '^@g;J?]M6e'
    
     

    Обратите внимание , что другие процедуры , сделанные немедленно доступны в random модуле - такие , как random.choice , random.randint и т.д. - не подходит для криптографических целей.

    За кулисами, эти процедуры использовать Вихрь Мерсенна ПСЧ , который не удовлетворяет требованиям , предъявляемым к CSPRNG . Таким образом, в частности, вам не следует использовать какие-либо из них для создания паролей, которые вы планируете использовать. Всегда используйте экземпляр SystemRandom , как показано выше.

    Начиная с Python 3.6 доступен модуль `секреты`, который предоставляет криптографически безопасную функциональность. Процитировав [официальную документацию] [pydoc-secrets-3.6], чтобы сгенерировать * "десятибуквенный буквенно-цифровой пароль, содержащий как минимум один символ в нижнем регистре, как минимум один символ в верхнем регистре и как минимум три цифры", * вы можете: импортировать строку alphabet = string.ascii_letters + string.digits, а True: пароль = '' .join (выбор (алфавит) для i в диапазоне (10)) if (любой (c.islower () для c в пароле) и любой (c. isupper () для c в пароле) и sum (c.isdigit () для c в пароле)> = 3): break
  • 0

    Случайное двоичное решение

     import random
    
    probability = 0.3
    
    if random.random() < probability:
        print("Decision with probability 0.3")
    else:
        print("Decision with probability 0.7") 

Синтаксис

Параметры

Примечания