Перейти к содержимому

Как сгенерировать рандомное число в питоне

  • автор:

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

Это мой первый серьёзный пост на подобную тему. В первую очередь я хочу очертить суть данной статьи. Тут я не буду разбирать полностью тему о генерации случайных чисел самим компьютером, за исключением одного термина для понимания разницы между Генерацией истинно случайных чисел(ГСЧ) и генерацией псевдослучайных чисел (ГПСЧ). Тут мы больше поговорим об алгоритмах которые используют языки программирования для генерации случайных чисел, и о том, почему они не случайны и не могут быть таковыми. Эта статья предназначена для тех программистов, которые минимум уже освоили функцию генерирующую случайные числа в своем языке, и хотят понять глубже эту тему. Я считаю эта тема одна из самых важных и в какой то степени сложной. Случайные числа очень полезны в различного рода алгоритмах, и понимание того, как они работают, возможно в будущем помогут вам сделать, что-то невероятное или просто полезное. А в конце я покажу свою псевдо-удачную попытку изобрести свой генератор псевдослучайных чисел.

Почему генерация случайных чисел в функциях языков программирования Не случайна?

Начнем с того, что на первый взгляд, кажется, что сгенерированное какой либо функцией число — абсолютно случайно. Но на деле — это Псевдослучайное число. Почему же его называют псевдослучайным? Суть в том, что оно получается путем вычислений. И тут мы сталкиваемся с тем, что генерация истинно случайных чисел, по определению не может быть никак вычисленной. Из-за того, что во многих подобных функциях используются алгоритмы(чаще всего похожие, либо модифицирован один и тот же), они не могут считаться истинно случайными.

Как можно получить истинно случайное число?

Я решил внедрить этот вопрос для большего понимания темы. И тут нам таки стоит ненадолго обратиться к материалам из общего определения ГСЧ самим компьютером. Хоть я и хотел в данном посте не прибегать к различного рода мудрым терминам, ведь его я пишу для новичков в данной теме. Но в этой части такие термины появятся, и эта часть окажется наверное самой сложной в этом посте. И так возвращаясь к вопросу. Как мы понимаем, для того что бы получить Истинно случайное число, у нас не должно быть каких либо вычислений, не считая входные данные, которые не всегда обязательны. И тут мы понимаем, что нужно выйти за рамки компьютера, хоть и не далеко от этих рамок, возможно даже остаться на границе с ними. Я подвожу к тому, что нам нужны какие-нибудь данные или средства из Реального мира, к тому-же, что то хаотичное. Можно взять к примеру шум вентиляторов вашего ПК или тепловой шум вашего процессора. Но опять таки эти данные нам придется обработать для получения результата, что нам не подходит.

Но тут на помощь приходит определение Энтропия. Из википедии: Энтропия — широко используемый в естественных и точных науках термин (впервые введён в рамках термодинамики как функция состояния термодинамической системы), обозначающий меру необратимого рассеивания энергии или бесполезности энергии.

А если простыми словами, то это мера хаоса в какой-либо системе, где система — это почти что угодно, в том числе и ваш ПК, или даже вся Вселенная! Из этого нас интересует лишь лишь мера хаоса. Мы пришли к хаотичности, то что нам нужно. Из этого выплывает, что на основе этого, можно собрать некое устройство, которое называют: Источник энтропии, или же Поставщик энтропии. Из википедии: Источники энтропии — используются для накопления энтропии, с последующим получением из неё начального значения, необходимого генераторам истинно случайных чисел (ГСЧ) для формирования случайных чисел. Отличие от генератора псевдослучайных чисел (ГПСЧ) в том, что ГПСЧ использует единственное начальное значение, откуда и получается его псевдослучайность, а ГСЧ всегда формирует случайное число, имея в начале высококачественную случайную величину, предоставленную различными источниками энтропии.

Тут мы наконец-таки получили ответ на основной вопрос. Хоть эта часть вышла слишком большой, но это понимание необходимо, что бы понять, что обычным алгоритмом, программно, получить истинно случайное число — невозможно. Однако не стоит этого пугаться. В большинстве случаев псевдослучайных чисел хватает. До того момента, пока вы не разрабатываете какой-либо серьезный алгоритм, в котором нужны только самые чистые данные.

Какие алгоритмы и методы используют в языках программирования для ГПСЧ?

По данному вопросу я сразу вспоминаю, про метод «Фибоначчи с запаздываниями» который используется в классе Random на платформе .NET(C#). Опять прибегнем к википедии: Запаздывающие генераторы Фибоначчи — генераторы псевдослучайных чисел, также называемые аддитивными генераторами. Однако это лишь метод, который является основой для алгоритмов.

Что такое «Аддитивные генераторы» и зачем они?

Аддитивные генераторы генерируют вместо случайных битов, случайные слова. Звучит уже страшно, но это не так сложно. Для начала нам нужно какое либо значение для данного генератора, которое будет ключом. Зная это состояние, можно составить формулу для вычисления n-ого слова генератора:

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

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

Как создать свой алгоритм для генерации псевдослучайного числа?

По сути я это рассказал в предыдущем блоке, а точнее дал основу для этого. Однако во-первых метод аддитивных генераторов не единственный, а лишь самый распространенный. А во-вторых давайте отбросим все эти скучные, пока что не понятные, и пока что не нужные формулы и правила. Давайте добавим немного фантазии и логики и сделаем на коленке свой алгоритм для ГПСЧ!

Впервые когда я задумался о подобном, я не представлял как это можно сделать. Однако немного подумав, понял, что мне нужно, что-то непостоянное. Что-либо, что после подстановки в формулу алгоритма оно тут же бы изменило свое значение. Самое не постоянное, что у меня было, это — время. А именно его миллисекунды. Я думаю, многие уже поняли какая суть была у моего алгоритма.

Снизу представлен код моего алгоритма, я его написал на языке Python. Да, я знаю, что это не самый лучший язык для написания подобных алгоритмов в плане скорости, я бы мог написать подобный код на том-же с# или с++, которые куда быстрее и лучше подходят для реализации таких алгоритмов. Однако python более человеко понятный и на нем объяснять алгоритмы куда проще.

import datetime def gen_random_int(first, second): if not isinstance(first, int) or not isinstance(second, int): # проверка на тип raise ValueError("First value and secod value must be int type") date_now = str(datetime.datetime.now())[-6:] # Выбираем из даты милисекунды integer_for_gen = int(date_now + date_now) # Приводим милисекунды к типу int и добавляем к строке еще цифрроке generated = 0 # Переменная для сгенерированного числа while(True): if generated >= first and generated 

Представленный алгоритм, ничто иное, как один из моих старых экспериментов. Он отлично работает с маленькими значениями, или значениями в которых разрыв между первым и вторым значение не большой. Однако я понимаю, что этот алгоритм не жизнеспособен, он далек от генерации даже псевдослучайных чисел, однако все таки числа полученные из него таки выглядят случайными. Я крайне не советую использовать такой алгоритм в реальных условиях, по крайне мене не в таком виде. Ибо при больших разрывах в значениях(200.000 и больше) Вы там вряд-ли увидите однозначные и даже 4-ехзначные числа. Но это был не плохой, маленький опыт. Отчасти у меня получилось сделать задуманное, поэтому в названии я написал "Псевдо-получилось".

Так-же можно путем таких экспериментов создать свой алгоритм, со своими уникальными данными. Это вовсе не сложно.

Итоги

После прочтения этой статьи, вы узнали, о том как работает генерация "случайных" чисел в вашем языке программирования(не важно какой это язык), и что они вовсе не случайны. А так-же, вы получили основу для создания своих алгоритмов по генерации псевдослучайных чисел. Эта тема очень обширная и большая, ни в одной статье за раз ее пройти невозможно, про нее можно писать книги. Эта статья лишь стартовая линия к началу этой огромной темы, и я надеюсь она помогла вам разобраться в основах генерации псевдослучайных чисел в программировании и не только.

  • генерация
  • случайные числа
  • генерация случайных чисел
  • программирование

Какая функция нужна для генерации случайного числа в Python?

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

random() возвращает случайно число (class 'float') в диапазоне от 0.0 до 1.0 (верхняя граница не входит в диапазон).

from random import random random() # 0.3380967837329142 random() # 0.07200652051529788 

randint(start, stop) возвращает случайное число (class 'int') в диапазоне от start до stop (обе границы включены в диапазон).

from random import randint randint(1, 7) # 4 randint(1, 7) # 2 

randrange(start, stop, step) возвращает случайное число (class 'int') из последовательности от start до stop (верхняя граница не входит в диапазон) с шагом = step. Параметры start и step необязательные, по умолчанию start = 0, step = 1.

from random import randrange randrange(4) # 1 randrange(4) # 3 random.randrange(4, 10) # 6 random.randrange(4, 10) # 9 random.randrange(4, 10, 2) # 4 random.randrange(4, 10, 2) # 8 

Генерация случайных чисел с плавающей точкой в Python

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

Например, если нужно сгенерировать случайную координату (x, y), где x и y являются числами с плавающей точкой в диапазоне от 0 до 1, то здесь приходит на помощь генерация случайных чисел с плавающей точкой.

Однако возникает вопрос: как получить случайные числа с плавающей точкой в Python?

Самый простой и распространенный способ – использование функции random.uniform() . Эта функция является частью модуля random в Python и возвращает случайное число с плавающей точкой в указанном диапазоне.

Вот пример использования random.uniform() :

import random x = random.uniform(0, 1) print(x)

В этом коде random.uniform(0, 1) генерирует случайное число с плавающей точкой в диапазоне от 0 до 1.

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

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

Генерация случайного числа в Python

Картинка к уроку

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

Генерация случайного числа с помощью модуля Random

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

import random

После этого можно воспользоваться необходимой вам функцией модуля Random.

Random.random

Функция возвращает случайное число в диапазоне 0 — 1.

import random print(random.random()) >>> 0.172676650596703 print(random.random()) >>> 0.41967198132083483 print(random.random()) >>> 0.9918523889221545

Random.uniform

Функция возвращает случайное вещественное число в указанном диапазоне.

import random print(random.uniform(0, 100)) >>>26.937418056935602 print(random.uniform(0, 100)) >>>50.37814119663015 print(random.uniform(0, 0.1)) >>>0.022964850436330765

В скобках указывается диапазон чисел random.unifrom(начало, конец).

Random.randint

Функция возвращает случайное целое число из указанного диапазона.

import random print(random.randint(0, 100)) >>> 3 print(random.randint(0, 100)) >>> 54 print(random.randint(0, 100000)) 31842

В скобках указывается диапазон чисел random.randint(начало, конец)

Random.randrange

Функция возвращает случайное число из указанного диапазона с определенным шагом. То есть, если мы зададим диапазон 0 — 10 и шаг 5, то функция вернет 0, 5 или 10.

import random print(random.randrange(0, 20, 5)) >>>0 print(random.randrange(0, 20, 5)) >>>15 print(random.randrange(0, 20, 2)) >>>12

В скобках указывается диапазон чисел и шаг, с которым выбирается случайное число random.randrage(начало, конец, шаг)

Random.choince

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

import random print(random.choices([0, 1, 12])) >>>[0] print(random.choices([0, 1, 12])) >>>[12] print(random.choices([0, 1, 12])) >>>[1]

Функция задается в формате random.choise(список).

Добавить комментарий

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