Random.uniform: примеры (PYTHON)

Работа с функцией 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. Его поведение идентично, но основано на криптографически стойком генераторе.

Расширенные примеры

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

Пример python
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

Имитация броска игральной кости с плавающим результатом (нецелый «кубик»).

Пример python
import random
# Генерация «дробного» броска кубика между 1 и 6
roll = random.uniform(1, 6)
print(f"Выпало: {roll:.4f}")
Выпало: 3.4567

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

Пример python
import random
# Генерация цен в диапазоне от 100.50 до 200.00 с двумя знаками после запятой
price = round(random.uniform(100.50, 200.00), 2)
print(f"Цена: {price}")
Цена: 150.75

Создание случайных временных интервалов для моделирования событий.

Пример python
import random
# Случайная задержка между 0.5 и 3.5 секундами
delay = random.uniform(0.5, 3.5)
print(f"Задержка: {delay:.2f} сек.")
Задержка: 2.34 сек.

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

Пример python
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 для воспроизводимости результатов в тестах.

Пример python
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

Моделирование равномерного распределения на окружности через угол.

Пример python
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)

питон random.uniform function comments

En
Random.uniform Return a random floating point number N such that a <= N <= b