Generování náhodných desetinných a celých čísel v jazyce Python, včetně funkcí random(), randrange() a randint()

Podnikání

Náhodná čísla lze generovat pomocí funkcí random(), uniform(), randange() a randint() v modulu random standardní knihovny jazyka Python.

Modul random je součástí standardní knihovny, takže není nutná žádná další instalace. Je ovšem nutné jej importovat.

Zde jsou uvedeny následující informace.

  • random.random()(Číslo s pohyblivou řádovou čárkou mezi 0,0 a 1,0)
  • random.uniform()(Jakýkoli rozsah čísel s plovoucí desetinnou čárkou)
  • Generování náhodných čísel, která se řídí normálním rozdělením, Gaussovým rozdělením atd.
  • random.randrange()(Celé číslo libovolného rozsahu a kroku)
  • random.randint()(Celé číslo v libovolném rozsahu)
  • Generování seznamu s náhodnými čísly jako prvky
    • Seznam náhodných čísel s pohyblivou řádovou čárkou
    • Seznam celých náhodných čísel
  • Inicializace generátoru náhodných čísel (stanovení semínka náhodných čísel)

V následujícím článku se dozvíte, jak náhodně vybírat nebo třídit prvky seznamu.

random.random() (Číslo s pohyblivou řádovou čárkou mezi 0,0 a 1,0)

Funkce random() modulu random vygeneruje náhodné číslo s pohyblivou řádovou čárkou typu float, které je v rozsahu 0,0 až 1,0.

import random

print(random.random())
# 0.4496839011176701

random.uniform() (Jakýkoli rozsah čísel s plovoucí desetinnou čárkou)

uniform(a, b)Funkce tohoto náhodného modulu generují náhodná čísla typu float s pohyblivou řádovou čárkou v některém z následujících rozsahů

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

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

Oba argumenty mohou být buď větší, nebo menší; pokud se rovnají, vrátí přirozeně pouze tuto hodnotu. Návratovou hodnotou je vždy float.

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

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

Argument lze zadat také jako float.

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

Zda je hodnota b zahrnuta do rozsahu, závisí na následujícím zaokrouhlení, jak je zdokumentováno.
a + (b-a) * random.random()

Zda je hodnota koncového bodu b v rozsahu, nebo ne, závisí na zaokrouhlování s plovoucí desetinnou čárkou v následující rovnici
a + (b-a) * random()
random.uniform() — Generate pseudo-random numbers — Python 3.10.2 Documentation

Generování náhodných čísel, která se řídí normálním rozdělením, Gaussovým rozdělením atd.

Výše uvedené funkce random() a uniform() generují rovnoměrně rozložená náhodná čísla, ale existují také funkce pro generování čísel s pohyblivou řádovou čárkou, která se řídí následujícím rozložením.

  • rozdělení beta:random.betavariate()
  • exponenciální rozdělení:random.expovariate()
  • gama rozdělení:random.gammavariate()
  • Gaussovo rozdělení:random.gauss()
  • lognormální rozdělení:random.lognormvariate()
  • normální rozdělení:random.normalvariate()
  • Von Misesovo rozdělení:random.vonmisesvariate()
  • Paretovo rozdělení:random.paretovariate()
  • Weibullovo rozdělení:random.weibullvariate()

Parametry jednotlivých distribucí se zadávají pomocí argumentů. Podrobnosti naleznete v oficiální dokumentaci.

random.randrange() (Celé číslo libovolného rozsahu a kroku)

randrange(start, stop, step)
Funkce tohoto náhodného modulu vrací náhodně vybraný prvek z následujících prvků.
range(start, stop, step)

Stejně jako u funkce range() lze argumenty start a step vynechat. Pokud jsou vynechány, start=0 a krok=1.

import random

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

print(random.randrange(10))
# 5

Argument step lze nastavit tak, aby generoval sudé nebo liché náhodné celé číslo nebo náhodné celé číslo, které je násobkem tří.

Pokud je například počátek sudý a krok=2, lze náhodně získat pouze sudá celá čísla v daném rozsahu.

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

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

random.randint() (Celé číslo v libovolném rozsahu)

randint(a, b)
Funkce tohoto náhodného modulu vrací následující náhodné celé číslo int.
a <= n <= b
randrange(a, b + 1)Ekvivalentní; všimněte si, že do rozsahu je zahrnuta i hodnota b.

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

Generování seznamu s náhodnými čísly jako prvky

V této části vysvětlíme, jak pomocí modulu random standardní knihovny vygenerovat seznam s náhodnými čísly jako prvky.

Seznam náhodných čísel s pohyblivou řádovou čárkou

Chcete-li vygenerovat seznam, jehož prvky jsou náhodná čísla s pohyblivou řádovou čárkou, zkombinujte funkce random() a uniform() se zápisem pro porozumění seznamu.

import random

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

Ve výše uvedeném příkladu je použita funkce range(), ale pro požadovaný počet prvků je možné použít i seznamy a tuply. Další podrobnosti o seznamových comprehenzích naleznete v následujícím článku.

Seznam celočíselných náhodných čísel int

Při generování seznamu, jehož prvky jsou celá náhodná čísla, může kombinace výše uvedených funkcí randange() a randint() s notací pro porozumění seznamu vést k duplicitním hodnotám.

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

Pokud chcete vytvořit náhodnou posloupnost celých čísel bez duplikací, vyberte prvky funkce range() s libovolným rozsahem pomocí funkce 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]

Další informace o funkci random.sample() naleznete v následujícím článku.

Inicializace generátoru náhodných čísel (stanovení semínka náhodných čísel)

Zadáním libovolného celého čísla do funkce seed() modulu random lze stanovit semeno náhodného čísla a inicializovat generátor náhodných čísel.

Po inicializaci stejným semínkem se náhodná hodnota generuje vždy stejným způsobem.

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