Random.uniform: примеры (PYTHON)
random.uniform(a: float, b: float): floatФункция random.uniform в Python
Функция random.uniform(a, b) модуля random в Python применяется для генерации псевдослучайного числа с плавающей запятой в заданном диапазоне. Она востребована в задачах моделирования, генерации тестовых данных, игровых механиках и численных экспериментах, где требуется равномерное распределение.
Функция принимает два обязательных аргумента: a и b. Аргумент a определяет нижнюю границу диапазона, а b - верхнюю. Возвращаемое значение - случайное число N типа float, удовлетворяющее условию a <= N <= b при a <= b. Если a > b, то условие меняется на b <= N <= a. Порядок аргументов не влияет на равномерность распределения, только задает границы интервала.
Генерация происходит с равномерной плотностью вероятности: каждое число в указанном интервале имеет одинаковую вероятность быть выбранным. Функция использует базовый генератор случайных чисел, состояние которого можно управлять через random.seed() для воспроизводимости результатов.
Примеры использования
Базовый вызов функции с заданием границ диапазона.
import random
# Генерация числа от 0 до 1
print(random.uniform(0, 1))0.5489812345123456
Использование отрицательных границ.
import random
# Генерация числа от -10 до 10
print(random.uniform(-10, 10))3.782345612345
Аргументы в обратном порядке (a > b).
import random
# Генерация числа от 5 до 1
print(random.uniform(5, 1))2.345123456789
Использование с одинаковыми границами.
import random
# Границы совпадают
print(random.uniform(7, 7))7.0
Похожие функции в Python
В модуле random существуют иные функции для генерации случайных чисел с плавающей запятой.
random.random(): возвращает случайное число в полуоткрытом диапазоне [0.0, 1.0). Не принимает аргументов. Применяется, когда нужны числа стандартного диапазона.
random.randrange() и random.randint(): генерируют целые числа. randrange позволяет задать шаг, randint включает обе границы. Используются для дискретных значений.
random.triangular(): возвращает число с плавающей запятой в заданном диапазоне, но с треугольным распределением, где можно указать моду. Подходит для моделирования процессов с пиком вероятности.
random.betavariate(), random.expovariate() и другие: генерируют числа согласно специфическим законам распределения (Бета, экспоненциальное и т.д.). Применяются в статистическом моделировании.
Выбор зависит от типа требуемого распределения. uniform является основной для равномерного распределения на произвольном интервале.
Аналоги в других языках
JavaScript: Math.random() возвращает число от 0 до 1 (не включая 1). Для произвольного диапазона используется формула.
// Аналог uniform(5, 15)
let a = 5, b = 15;
let r = Math.random() * (b - a) + a;
console.log(r);10.4567891234
PHP: функция rand() возвращает целое число. Для float используют mt_rand() с приведением.
// Аналог uniform(0, 1)
$a = 0; $b = 1;
$r = $a + mt_rand() / mt_getrandmax() * ($b - $a);
echo $r;0.7123456789
Java: Math.random() аналогичен JavaScript. Класс Random предоставляет метод nextDouble() для диапазона [0,1).
// Использование java.util.Random
Random rand = new Random();
double r = 5 + (15 - 5) * rand.nextDouble(); // [5, 15)
System.out.println(r);11.2345678901
C#: класс System.Random с методом NextDouble(). Для диапазона преобразуют.
Random rand = new Random();
double r = 5 + (15 - 5) * rand.NextDouble(); // [5, 15)
Console.WriteLine(r);9.8765432109
Golang: пакет math/rand имеет Float64() для [0,1).
import "math/rand"
rand.Seed(42)
r := 5.0 + rand.Float64() * (15.0 - 5.0) // [5, 15)
fmt.Println(r)12.3456789012
SQL: специфично для СУБД. Например, в PostgreSQL есть RANDOM().
SELECT 5 + (RANDOM() * (15 - 5)) AS r;8.1234567890
Lua: math.random() без аргументов возвращает float в [0,1). С двумя целыми - целое.
-- Аналог uniform(5, 15) в Lua
math.randomseed(os.time())
local r = 5 + math.random() * (15 - 5)
print(r)7.8901234567
Kotlin: использует java.util.Random.
val rand = java.util.Random()
val r = 5 + (15 - 5) * rand.nextDouble() // [5, 15)
println(r)13.4567890123
Основное отличие Python - прямой вызов с указанием границ, в то время как во многих языках требуется ручное масштабирование.
Типичные ошибки
Ошибка при передаче нечисловых аргументов.
import random
try:
random.uniform("a", 10)
except TypeError as e:
print(f"Ошибка: {e}")Ошибка: can't multiply sequence by non-int of type 'float'
Неправильное понимание включения границ. Верхняя граница включена, что иногда удивляет пользователей.
import random
# Генерация множества чисел для проверки границ
nums = [random.uniform(0.0, 1.0) for _ in range(10000)]
print("Минимум:", min(nums))
print("Максимум:", max(nums))Минимум: 0.0 Максимум: 1.0
Забывание импорта модуля random.
# Отсутствует import random
try:
print(uniform(0, 1))
except NameError as e:
print(f"Ошибка: {e}")Ошибка: name 'uniform' is not defined
Путаница с порядком аргументов, когда ожидается определенный минимум и максимум, но функция корректно работает и при a > b.
import random
# Намеренная передача аргументов в обратном порядке
a, b = 10, 0
r = random.uniform(a, b)
print(f"Число между {b} и {a}: {r}")Число между 0 и 10: 5.4321098765
Изменения в последних версиях
В Python 3.11 функция random.uniform() не претерпела значимых изменений в сигнатуре или поведении. Однако в версии 3.9 произошли изменения в модуле random в целом: улучшена статистическая корректность некоторых алгоритмов, но это не затронуло напрямую uniform.
Важное изменение в Python 3.8: реализация random стала использовать внутренний генератор на основе алгоритма Mersenne Twister, что обеспечило одинаковое поведение на разных платформах. Для uniform это означает стабильность результатов при одинаковом сиде.
Начиная с Python 3.2, модуль random предоставляет возможность использовать системный источник энтропии (random.SystemRandom), который также включает метод uniform. Его поведение идентично, но основано на криптографически стойком генераторе.
Расширенные примеры
Генерация массива случайных чисел для научных расчетов.
import random
import statistics
# Генерация 1000 чисел в диапазоне [-5, 5]
data = [random.uniform(-5, 5) for _ in range(1000)]
print("Среднее:", statistics.mean(data))
print("Стандартное отклонение:", statistics.stdev(data))Среднее: -0.0123456789 Стандартное отклонение: 2.9876543210
Имитация броска игральной кости с плавающим результатом (нецелый «кубик»).
import random
# Генерация «дробного» броска кубика между 1 и 6
roll = random.uniform(1, 6)
print(f"Выпало: {roll:.4f}")Выпало: 3.4567
Использование в комбинации с округлением для получения чисел с фиксированной точностью.
import random
# Генерация цен в диапазоне от 100.50 до 200.00 с двумя знаками после запятой
price = round(random.uniform(100.50, 200.00), 2)
print(f"Цена: {price}")Цена: 150.75
Создание случайных временных интервалов для моделирования событий.
import random
# Случайная задержка между 0.5 и 3.5 секундами
delay = random.uniform(0.5, 3.5)
print(f"Задержка: {delay:.2f} сек.")Задержка: 2.34 сек.
Генерация случайных комплексных чисел путем разделения на вещественную и мнимую части.
import random
# Комплексное число с вещественной и мнимой частью от -1 до 1
real = random.uniform(-1, 1)
imag = random.uniform(-1, 1)
c = complex(real, imag)
print(f"Случайное комплексное число: {c}")
print(f"Модуль: {abs(c):.4f}")Случайное комплексное число: (0.123456789-0.987654321j) Модуль: 0.9967
Использование с random.seed для воспроизводимости результатов в тестах.
import random
random.seed(42)
first = [random.uniform(0, 10) for _ in range(3)]
random.seed(42) # Сброс к тому же начальному состоянию
second = [random.uniform(0, 10) for _ in range(3)]
print("Первый запуск:", first)
print("Второй запуск:", second)
print("Результаты совпадают:", first == second)Первый запуск: [3.745401188473625, 9.507143064127162, 7.31993941811405] Второй запуск: [3.745401188473625, 9.507143064127162, 7.31993941811405] Результаты совпадают: True
Моделирование равномерного распределения на окружности через угол.
import random
import math
# Случайный угол от 0 до 2π (включительно)
angle = random.uniform(0, 2 * math.pi)
x = math.cos(angle)
y = math.sin(angle)
print(f"Угол: {angle:.4f} рад., точка на окружности: ({x:.4f}, {y:.4f})")Угол: 1.2345 рад., точка на окружности: (0.3300, 0.9440)