Generowanie losowych liczb dziesiętnych i całkowitych w Pythonie, w tym random(), randrange() i randint()

Biznes

Liczby losowe mogą być generowane przy użyciu funkcji random(), uniform(), randange() i randint() w module random standardowej biblioteki Pythona.

Moduł random jest zawarty w standardowej bibliotece, więc nie jest wymagana żadna dodatkowa instalacja. Oczywiście, musisz go zaimportować.

Podane są tu następujące informacje.

  • random.random()(Liczba zmiennoprzecinkowa z przedziału od 0,0 do 1,0)
  • random.uniform()(Dowolny zakres liczb zmiennoprzecinkowych)
  • Generowanie liczb losowych, które mają rozkład normalny, gaussowski itp.
  • random.randrange()(Liczba całkowita o dowolnym zakresie i kroku)
  • random.randint()(Liczba całkowita w dowolnym zakresie)
  • Generowanie listy z liczbami losowymi jako elementami
    • Lista losowych liczb zmiennoprzecinkowych
    • Lista liczb losowych całkowitych
  • Inicjalizacja generatora liczb losowych (ustalenie ziarna liczb losowych)

Zobacz poniższy artykuł o tym, jak losowo wyodrębnić lub posortować elementy listy.

random.random() (Liczba zmiennoprzecinkowa z przedziału od 0,0 do 1,0)

Funkcja random() modułu random generuje losową liczbę zmiennoprzecinkową typu float, która znajduje się w przedziale od 0.0 do 1.0.

import random

print(random.random())
# 0.4496839011176701

random.uniform() (Dowolny zakres liczb zmiennoprzecinkowych)

uniform(a, b)Funkcje tego modułu generują liczby losowe typu zmiennoprzecinkowego float w dowolnym z poniższych zakresów

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

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

Dwa argumenty mogą być albo większe albo mniejsze; jeśli są równe, to naturalnie zwrócą tylko tę wartość. Wartością zwracaną jest zawsze liczba zmiennoprzecinkowa (float).

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

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

Argument może być również podany jako float.

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

To, czy wartość b jest zawarta w przedziale, zależy od następujących zaokrągleń, zgodnie z dokumentacją.
a + (b-a) * random.random()

To, czy wartość punktu końcowego b jest w zakresie, czy nie, zależy od zaokrąglenia zmiennoprzecinkowego w następującym równaniu
a + (b-a) * random()
random.uniform() — Generate pseudo-random numbers — Python 3.10.2 Documentation

Generowanie liczb losowych, które mają rozkład normalny, gaussowski itp.

Funkcje random() i uniform() powyżej generują równomiernie rozłożone liczby losowe, ale istnieją również funkcje do generowania liczb zmiennoprzecinkowych, które podążają za następującym rozkładem.

  • rozkład beta:random.betavariate()
  • rozkład wykładniczy:random.expovariate()
  • rozkład gamma:random.gammavariate()
  • Rozkład gaussowski:random.gauss()
  • rozkład lognormalny:random.lognormvariate()
  • rozkład normalny:random.normalvariate()
  • Rozkład Von Misesa:random.vonmisesvariate()
  • Rozkład Pareto:random.paretovariate()
  • Rozkład Weibulla:random.weibullvariate()

Parametry każdej dystrybucji są określane przez argumenty. Zobacz oficjalną dokumentację dla szczegółów.

random.randrange() (Liczba całkowita o dowolnym zakresie i kroku)

randrange(start, stop, step)
Funkcja tego modułu losowego zwraca losowo wybrany element z następujących elementów.
range(start, stop, step)

Podobnie jak w przypadku range(), argumenty start i krok mogą być pominięte. Jeśli je pominięto, to start=0 i krok=1.

import random

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

print(random.randrange(10))
# 5

Argument krok może być ustawiony na generowanie parzystej lub nieparzystej liczby losowej, lub liczby losowej będącej wielokrotnością trzech.

Na przykład, jeśli początek jest parzysty, a krok=2, to tylko parzyste liczby całkowite w zakresie mogą być otrzymane losowo.

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

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

random.randint() (Liczba całkowita w dowolnym zakresie)

randint(a, b)
Funkcja tego modułu losowego zwraca następującą losową liczbę całkowitą int.
a <= n <= b
randrange(a, b + 1)Równoważne temu; zauważ, że wartość b jest również zawarta w zakresie.

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

Generowanie listy z liczbami losowymi jako elementami

W tym rozdziale wyjaśnimy, jak użyć modułu random biblioteki standardowej do wygenerowania listy z liczbami losowymi jako elementami.

Lista liczb losowych o zmiennoprzecinkowych wartościach zmiennoprzecinkowych

Aby wygenerować listę, której elementy są zmiennoprzecinkowymi liczbami losowymi, połącz funkcje random() i uniform() z notacją zrozumienia listy.

import random

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

W powyższym przykładzie, użyto range(), ale listy i tuple są również możliwe dla pożądanej liczby elementów. Aby uzyskać więcej szczegółów na temat list comprehensions, proszę zapoznać się z poniższym artykułem.

Lista liczb losowych typu integer int

Podczas generowania listy, której elementy są liczbami losowymi całkowitymi, połączenie powyższych funkcji randange() i randint() z notacją list comprehension może skutkować zduplikowanymi wartościami.

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

Jeśli chcesz stworzyć losową sekwencję liczb całkowitych bez duplikatów, wyodrębnij elementy funkcji range() z arbitralnym zakresem używając 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]

Więcej informacji na temat funkcji random.sample() znajdziesz w poniższym artykule.

Inicjalizacja generatora liczb losowych (ustalenie ziarna liczb losowych)

Przez podanie dowolnej liczby całkowitej do funkcji seed() modułu random, ziarno liczb losowych może zostać ustalone i generator liczb losowych może zostać zainicjalizowany.

Po inicjalizacji z tym samym ziarnem, wartość losowa jest zawsze generowana w ten sam sposób.

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