Xerando decimais aleatorios e enteiros en Python, incluíndo random(), randrange() e randint()

Negocios

Pódense xerar números aleatorios usando as funcións random(), uniform(), randange() e randint() no módulo aleatorio da biblioteca estándar de Python.

O módulo aleatorio inclúese na biblioteca estándar, polo que non se precisa instalación adicional. Por suposto, cómpre importalo.

A seguinte información ofrécese aquí.

  • random.random()(Número de coma flotante entre 0,0 e 1,0)
  • random.uniform()(Calquera intervalo de números de coma flotante)
  • Xera números aleatorios que seguen unha distribución normal, distribución gaussiana, etc.
  • random.randrange()(Número enteiro de intervalo e paso arbitrarios)
  • random.randint()(Un número enteiro en calquera intervalo)
  • Xeración dunha lista con números aleatorios como elementos
    • Lista de números aleatorios en coma flotante
    • Lista de números aleatorios enteiros
  • Inicializa o xerador de números aleatorios (fixa a semente de números aleatorios)

Consulta o seguinte artigo sobre como extraer ou ordenar aleatoriamente elementos dunha lista.

random.random()(Número de coma flotante entre 0,0 e 1,0)

A función random() do módulo aleatorio xera un número aleatorio de coma flotante de tipo float que está entre 0,0 e 1,0.

import random

print(random.random())
# 0.4496839011176701

random.uniform()(Calquera intervalo de números de coma flotante)

uniform(a, b)As funcións deste módulo aleatorio xeran números aleatorios de tipo flotante de número de coma flotante en calquera dos seguintes intervalos

  • a <= n <= b
  • b <= n <= a
import random

print(random.uniform(100, 200))
# 175.26585048238275

Os dous argumentos poden ser maiores ou menores; se son iguais, naturalmente só devolverán ese valor. O valor de retorno é sempre un flotante.

print(random.uniform(100, -100))
# -27.82338731501028

print(random.uniform(100, 100))
# 100.0

O argumento tamén se pode especificar como flotante.

print(random.uniform(1.234, 5.637))
# 2.606743596829249

Se o valor de b está incluído no intervalo depende do seguinte redondeo, segundo se documenta.
a + (b-a) * random.random()

Se o valor do punto final b está no intervalo ou non depende do redondeo de coma flotante na seguinte ecuación
a + (b-a) * random()
random.uniform() — Generate pseudo-random numbers — Python 3.10.2 Documentation

Xera números aleatorios que seguen unha distribución normal, distribución gaussiana, etc.

As funcións aleatorias() e uniform() anteriores xeran números aleatorios distribuídos uniformemente, pero tamén hai funcións para xerar números de coma flotante que seguen a seguinte distribución.

  • distribución beta:random.betavariate()
  • distribución exponencial:random.expovariate()
  • distribución gamma:random.gammavariate()
  • Distribución gaussiana:random.gauss()
  • distribución logarítmica normal:random.lognormvariate()
  • distribución normal:random.normalvariate()
  • Distribución Von Mises:random.vonmisesvariate()
  • Distribución de Pareto:random.paretovariate()
  • Distribución Weibull:random.weibullvariate()

Os parámetros de cada distribución especifícanse mediante argumentos. Consulte a documentación oficial para obter máis detalles.

random.randrange()(Número enteiro de intervalo e paso arbitrarios)

randrange(start, stop, step)
A función deste módulo aleatorio devolve un elemento seleccionado aleatoriamente entre os seguintes elementos.
range(start, stop, step)

Do mesmo xeito que con range(), pódense omitir os argumentos start e step. Se se omiten, inicio=0 e paso=1.

import random

print(list(range(10)))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(random.randrange(10))
# 5

O paso do argumento pódese configurar para xerar un número enteiro aleatorio par ou impar, ou un número enteiro aleatorio que sexa múltiplo de tres.

Por exemplo, se inicio é par e step=2, só se poden obter aleatoriamente os enteiros pares do intervalo.

print(list(range(10, 20, 2)))
# [10, 12, 14, 16, 18]

print(random.randrange(10, 20, 2))
# 18

random.randint()(Un número enteiro en calquera intervalo)

randint(a, b)
A función deste módulo aleatorio devolve o seguinte enteiro aleatorio int.
a <= n <= b
randrange(a, b + 1)Equivalente a isto; Teña en conta que o valor de b tamén está incluído no intervalo.

print(random.randint(50, 100))
# print(random.randrange(50, 101))
# 74

Xeración dunha lista con números aleatorios como elementos

Neste apartado, explicaremos como utilizar o módulo aleatorio da biblioteca estándar para xerar unha lista con números aleatorios como elementos.

Lista de números aleatorios con flotantes de coma flotante

Para xerar unha lista cuxos elementos sexan números aleatorios de coma flotante, combine as funcións random() e uniform() coa notación de comprensión de lista.

import random

print([random.random() for i in range(5)])
# [0.5518201298350598, 0.3476911314933616, 0.8463426180468342, 0.8949046353303931, 0.40822657702632625]

No exemplo anterior, úsase range(), pero tamén son posibles listas e tuplas para o número de elementos desexado. Para obter máis detalles sobre a comprensión das listas, consulte o seguinte artigo.

Lista de enteiros int números aleatorios

Cando se xera unha lista cuxos elementos son números aleatorios enteiros, a combinación dos anteriores randange() e randint() coa notación de comprensión da lista pode producir valores duplicados.

print([random.randint(0, 10) for i in range(5)])
# [8, 5, 7, 10, 7]

Se queres facer unha secuencia aleatoria de números enteiros sen duplicación, extrae os elementos de range() cun intervalo arbitrario usando random.sample().

print(random.sample(range(10), k=5))
# [6, 4, 3, 7, 5]

print(random.sample(range(100, 200, 10), k=5))
# [130, 190, 140, 150, 170]

Para obter máis información sobre random.sample(), consulte o seguinte artigo.

Inicializa o xerador de números aleatorios (fixa a semente de números aleatorios)

Ao dar un número enteiro arbitrario á función seed() do módulo aleatorio, pódese corrixir a semente de números aleatorios e inicializar o xerador de números aleatorios.

Despois da inicialización coa mesma semente, o valor aleatorio xérase sempre do mesmo xeito.

random.seed(0)
print(random.random())
# 0.8444218515250481

print(random.random())
# 0.7579544029403025

random.seed(0)
print(random.random())
# 0.8444218515250481

print(random.random())
# 0.7579544029403025