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

Раздел: Алгоритмы -> Случайные числа

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

Как получить случайное целое число между a и b включительно?

Наиболее эффективный способ - использование функции randint из модуля random. Она возвращает случайное целое N такое, что a ≤ N ≤ b.

import random
random.randint(1, 10)

Python случайное число в диапазоне (генерация случайного числа в заданном диапазоне в python)

7

Python список случайных чисел (генерация списка случайных чисел в python)

Пояснение: функция принимает два аргумента - нижнюю и верхнюю границы. Обе границы включены в диапазон. Этот метод быстр и интуитивно понятен.

Типичная ошибка: передача границ в неправильном порядке (a > b) вызовет ValueError. Всегда проверять, что a ≤ b.

Ещё одна проблема: при многократном вызове randint внутри циклов может возникнуть повторяемость из-за фиксированного seed. Для отладки можно установить seed: random.seed(42).

Как выбрать случайное целое с шагом (например, чётное число)?

Функция randrange позволяет задать начало, конец и шаг. Аналог range, но случайный выбор.

import random
random.randrange(0, 21, 2)

Random числа python (генерация случайных чисел в python)

14

Python random int (генерация случайных целых чисел в python)

В отличие от randint, randrange не включает правую границу по умолчанию, если шаг равен 1. Но с шагом >1 поведение аналогично range: stop не включается. Для включения правой границы нужно adjust: randrange(a, b+1, step).

Частая путаница: считать, что randrange(b) генерирует числа от 0 до b включительно. На самом деле от 0 до b-1. Это важно для диапазонов.

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

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

import random
random.uniform(2.5, 5.5)
3.824

Для целых чисел с плавающей точкой можно комбинировать randint и деление, но uniform проще.

Как получить случайное число в диапазоне, используя только random.random()?

Функция random.random() возвращает число от 0.0 до 1.0 (не включая 1.0). Чтобы масштабировать до [a, b], применяют формулу: a + random.random() * (b - a).

a, b = 10, 20
num = a + random.random() * (b - a)
15.437

Этот метод полезен, когда нужно контролировать распределение или использовать несколько генераторов. Однако он не даёт включения верхней границы (1.0 не достигается). Для включения можно заменить random.random() на 1 - random.random() или использовать random.uniform.

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

Для безопасности (пароли, токены) используйте модуль secrets. Функция randbelow генерирует целое число от 0 до n-1. Для диапазона [a, b] используйте a + secrets.randbelow(b - a + 1).

import secrets
a, b = 100, 200
secure_num = a + secrets.randbelow(b - a + 1)
167

secrets гарантирует непредсказуемость, но работает медленнее random. Подходит для генерации ключей.

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

Используйте random.choice для списка или кортежа. Можно создать список возможных чисел и выбрать одно.

import random
options = [1, 3, 7, 15, 22]
random.choice(options)
7

Это удобно для дискретных нерегулярных диапазонов. Если нужно несколько чисел без повторений - random.sample.

Ошибка: передача пустого списка вызовет IndexError. Следует проверять длину.

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

Для научных вычислений используют библиотеку NumPy. Функция numpy.random.randint создаёт массив целых чисел.

import numpy as np
np.random.randint(0, 10, size=5)
array([3, 7, 2, 9, 4])

Для вещественных - numpy.random.uniform.

Продвинутые сценарии генерации случайных чисел в диапазоне

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

Пример
# 1. Генерация случайной даты в заданном диапазоне (datetime)
import random
from datetime import datetime, timedelta

start = datetime(2023, 1, 1)
end = datetime(2023, 12, 31)
delta = end - start
random_days = random.randint(0, delta.days)
random_date = start + timedelta(days=random_days)
print(random_date)
2023-04-17 00:00:00

Пояснение: создаётся временной интервал в днях, выбирается случайное количество дней от нуля до общей разницы. Результат - случайная дата между start и end включительно.

Пример
# 2. Генерация случайного числа с плавающей точкой с заданной точностью
import random
a, b = 0, 1
precision = 3
random_float = round(a + random.random() * (b - a), precision)
print(random_float)
0.782

Используется round для ограничения знаков. Если нужна фиксированная точность, можно умножать и делить на 10^prec.

Пример
# 3. Генерация случайного числа в диапазоне логарифмической шкалы
import random
import math
lower, upper = 1, 1000
log_lower = math.log(lower)
log_upper = math.log(upper)
random_log = math.exp(log_lower + random.random() * (log_upper - log_lower))
print(random_log)
123.456

Полезно для величин, которые распределены по степенному закону, например размеры файлов.

Пример
# 4. Генерация случайного числа из дискретного набора с заданными вероятностями (взвешенный выбор)
import random
values = [1, 2, 3, 4]
weights = [0.1, 0.2, 0.3, 0.4]
random_choice = random.choices(values, weights=weights, k=1)[0]
print(random_choice)
3

Функция choices позволяет задать веса. Сумма весов не обязана быть 1.0.

Пример
# 5. Генерация чисел с использованием собственного ГПСЧ (линейный конгруэнтный метод) для демонстрации
seed = 12345
a = 1664525
c = 1013904223
m = 2**32
def lcg(seed):
    return (a * seed + c) % m
seed = lcg(seed)
random_num = seed % 100
print(random_num)
76

Пример реализации простого ГПСЧ для понимания принципов. В реальных проектах использовать random или secrets.

Пример
# 6. Генерация случайного числа в диапазоне с отбрасыванием некоторых значений (rejection sampling)
import random
def random_in_range_excluding(a, b, exclude_set):
    while True:
        candidate = random.randint(a, b)
        if candidate not in exclude_set:
            return candidate
print(random_in_range_excluding(1, 10, {2,5,8}))
7

Метод отбраковки: генерируем число, пока оно не попадёт в разрешённое множество. Может быть неэффективным, если exclude_set большой.

Пример
# 7. Генерация нескольких случайных чисел без повторений в диапазоне (sample)
import random
random.sample(range(1, 50), 5)
[12, 35, 7, 42, 21]

Важно: размер sample не должен превышать длину диапазона.

Генерация случайного числа в заданном диапазоне в Python - comments

En
Python случайное число в диапазоне (python)