Odpowiedzi:
Próbować:
from random import randrange
print(randrange(10))
Więcej informacji: http://docs.python.org/library/random.html#random.randrange
secrets
modułu, aby uzyskać lepsze liczby losowe. Odniesienie: docs.python.org/3/library/random.html
import random
print(random.randint(0,9))
random.randint(a, b)
Zwraca losową liczbę całkowitą N taką, że a <= N <= b.
Dokumenty: https://docs.python.org/3.1/library/random.html#random.randint
randint(0,9)
Nigdy nie zwróci 9). Nie znajduje to odzwierciedlenia w dokumentacji online, ale we wbudowanej pomocy.
Spróbuj tego:
from random import randrange, uniform
# randrange gives you an integral value
irand = randrange(0, 10)
# uniform gives you a floating-point value
frand = uniform(0, 10)
from random import randint
x = [randint(0, 9) for p in range(0, 10)]
Generuje to 10 pseudolosowych liczb całkowitych z zakresu od 0 do 9 włącznie.
secrets
Moduł nowego w Pythonie 3.6. Jest to lepsze niż random
moduł do zastosowań w kryptografii lub zabezpieczeniach.
Aby losowo wydrukować liczbę całkowitą z zakresu 0–9:
from secrets import randbelow
print(randbelow(10))
Aby uzyskać szczegółowe informacje, zobacz PEP 506 .
Wybierz rozmiar tablicy (w tym przykładzie wybrałem rozmiar 20). A następnie użyj następujących poleceń:
import numpy as np
np.random.randint(10, size=(1, 20))
Możesz spodziewać się wyniku w następującej postaci ( przy każdym uruchomieniu zwracane będą różne losowe liczby całkowite; dlatego możesz oczekiwać, że liczby całkowite w tablicy wyjściowej będą się różnić od podanego poniżej przykładu ).
array([[1, 6, 1, 2, 8, 6, 3, 3, 2, 5, 6, 5, 0, 9, 5, 6, 4, 5, 9, 3]])
Wypróbuj to random.shuffle
>>> import random
>>> nums = range(10)
>>> random.shuffle(nums)
>>> nums
[6, 3, 5, 4, 0, 1, 2, 9, 8, 7]
Spróbowałbym jednej z następujących czynności:
import numpy as np
X1 = np.random.randint(low=0, high=10, size=(15,))
print (X1)
>>> array([3, 0, 9, 0, 5, 7, 6, 9, 6, 7, 9, 6, 6, 9, 8])
import numpy as np
X2 = np.random.uniform(low=0, high=10, size=(15,)).astype(int)
print (X2)
>>> array([8, 3, 6, 9, 1, 0, 3, 6, 3, 3, 1, 2, 4, 0, 4])
3.> random.randrange
from random import randrange
X3 = [randrange(10) for i in range(15)]
print (X3)
>>> [2, 1, 4, 1, 2, 8, 8, 6, 4, 1, 0, 5, 8, 3, 5]
4.> random.randint
from random import randint
X4 = [randint(0, 9) for i in range(0, 15)]
print (X4)
>>> [6, 2, 6, 9, 5, 3, 2, 3, 3, 4, 4, 7, 4, 9, 6]
Prędkość:
► np.random.randint jest najszybszy , a następnie np.random.uniform i random.randrange . random.randint jest najwolniejszy .
► Zarówno np.random.randint, jak i np.random.uniform są znacznie szybsze (~ 8-12 razy szybciej) niż random.randrange i random.randint .
%timeit np.random.randint(low=0, high=10, size=(15,))
>> 1.64 µs ± 7.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit np.random.uniform(low=0, high=10, size=(15,)).astype(int)
>> 2.15 µs ± 38.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit [randrange(10) for i in range(15)]
>> 12.9 µs ± 60.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit [randint(0, 9) for i in range(0, 15)]
>> 20 µs ± 386 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Uwagi:
1.> np.random.randint generuje losowe liczby całkowite w przedziale półotwartym [niski, wysoki).
2.> np.random.uniform generuje równomiernie rozmieszczone liczby w półotwartym przedziale [niski, wysoki).
3.> random.randrange (stop) generuje losową liczbę z zakresu (start, stop, krok).
4.> random.randint (a, b) zwraca losową liczbę całkowitą N taką, że a <= N <= b.
5.> astype (int) rzutuje tablicę numpy na int typ danych.
6.> Wybrałem rozmiar = (15,). Otrzymasz tablicę liczb numpy o długości = 15.
W przypadku liczb ciągłych randint
lub randrange
prawdopodobnie najlepszym wyborem, ale jeśli masz kilka różnych wartości w sekwencji (tj. A list
), możesz również użyć choice
:
>>> import random
>>> values = list(range(10))
>>> random.choice(values)
5
choice
działa również dla jednego elementu z nieciągłej próbki:
>>> values = [1, 2, 3, 5, 7, 10]
>>> random.choice(values)
7
Jeśli potrzebujesz go „silnie kryptograficznie”, jest także secrets.choice
w Pythonie 3.6 i nowszych:
>>> import secrets
>>> values = list(range(10))
>>> secrets.choice(values)
2
random.sample
. Z zamiennikiem możesz użyć choice
[choice(values) for _ in range(3)]
Chociaż wiele stanowisk wykazać jak dostać jedną losową liczbę całkowitą, oryginalne pytanie pyta jak wygenerować losową liczbę całkowitą s (liczba mnoga):
Jak mogę wygenerować losowe liczby całkowite od 0 do 9 (włącznie) w Pythonie?
Dla jasności tutaj pokazujemy, jak uzyskać wiele losowych liczb całkowitych.
Dany
>>> import random
lo = 0
hi = 10
size = 5
Kod
Wiele losowych liczb całkowitych
# A
>>> [lo + int(random.random() * (hi - lo)) for _ in range(size)]
[5, 6, 1, 3, 0]
# B
>>> [random.randint(lo, hi) for _ in range(size)]
[9, 7, 0, 7, 3]
# C
>>> [random.randrange(lo, hi) for _ in range(size)]
[8, 3, 6, 8, 7]
# D
>>> lst = list(range(lo, hi))
>>> random.shuffle(lst)
>>> [lst[i] for i in range(size)]
[6, 8, 2, 5, 1]
# E
>>> [random.choice(range(lo, hi)) for _ in range(size)]
[2, 1, 6, 9, 5]
Próbka losowych liczb całkowitych
# F
>>> random.choices(range(lo, hi), k=size)
[3, 2, 0, 8, 2]
# G
>>> random.sample(range(lo, hi), k=size)
[4, 5, 1, 2, 3]
Detale
Niektóre posty pokazują, jak natywnie generować wiele losowych liczb całkowitych. 1 Oto kilka opcji, które rozwiązują dorozumiane pytanie:
random.random
zwraca losową liczbę zmiennoprzecinkową w zakresie[0.0, 1.0)
random.randint
zwraca losową liczbę całkowitą N
taką, żea <= N <= b
random.randrange
alias dorandint(a, b+1)
random.shuffle
tasuje sekwencję w miejscurandom.choice
zwraca losowy element z niepustej sekwencjirandom.choices
zwraca k
selekcje z populacji (z zastąpieniem, Python 3.6+)random.sample
zwraca k
unikalne selekcje z populacji (bez zamiany): 2Zobacz także przemówienie R. Hettingera na temat dzielenia i aliasowania na przykładach z random
modułu.
Oto porównanie niektórych losowych funkcji w bibliotece standardowej i Numpy:
| | random | numpy.random |
|-|-----------------------|----------------------------------|
|A| random() | random() |
|B| randint(low, high) | randint(low, high) |
|C| randrange(low, high) | randint(low, high) |
|D| shuffle(seq) | shuffle(seq) |
|E| choice(seq) | choice(seq) |
|F| choices(seq, k) | choice(seq, size) |
|G| sample(seq, k) | choice(seq, size, replace=False) |
Możesz także szybko przekonwertować jedną z wielu dystrybucji w Numpy na próbkę losowych liczb całkowitych. 3)
Przykłady
>>> np.random.normal(loc=5, scale=10, size=size).astype(int)
array([17, 10, 3, 1, 16])
>>> np.random.poisson(lam=1, size=size).astype(int)
array([1, 3, 0, 2, 0])
>>> np.random.lognormal(mean=0.0, sigma=1.0, size=size).astype(int)
array([1, 3, 1, 5, 1])
1 Mianowicie @John Lawrence Aspden, @ST Mohammed, @SiddTheKid, @ user14372, @zangw, i in. 2 @prashanth wspomina o tym module pokazując jedną liczbę całkowitą. 3 Demonstrowane przez @Siddharth Satpathy
jeśli chcesz użyć numpy, użyj następujących poleceń:
import numpy as np
print(np.random.randint(0,10))
>>> import random
>>> random.randrange(10)
3
>>> random.randrange(10)
1
Aby uzyskać listę dziesięciu próbek:
>>> [random.randrange(10) for x in range(10)]
[9, 0, 4, 0, 5, 7, 4, 3, 6, 8]
Generowanie losowych liczb całkowitych od 0 do 9.
import numpy
X = numpy.random.randint(0, 10, size=10)
print(X)
Wynik:
[4 8 0 4 9 6 9 9 0 7]
Najlepszym sposobem jest użycie funkcji importowania losowego
import random
print(random.sample(range(10), 10))
lub bez importu biblioteki:
n={}
for i in range(10):
n[i]=i
for p in range(10):
print(n.popitem()[1])
tutaj popitemy usuwają i zwracają dowolną wartość ze słownika n
.
Jest to bardziej podejście matematyczne, ale działa w 100% przypadków:
Powiedzmy, że chcesz użyć random.random()
funkcji do wygenerowania liczby między a
a b
. Aby to osiągnąć, wykonaj następujące czynności:
num = (b-a)*random.random() + a;
Oczywiście możesz wygenerować więcej liczb.
Ze strony dokumentacji losowego modułu:
Ostrzeżenie: Pseudolosowych generatorów tego modułu nie należy używać ze względów bezpieczeństwa. Użyj os.urandom () lub SystemRandom, jeśli potrzebujesz kryptograficznie bezpiecznego generatora liczb pseudolosowych.
random.SystemRandom , który został wprowadzony w Pythonie 2.4, jest uważany za kryptograficznie bezpieczny . Jest nadal dostępny w Pythonie 3.7.1, który jest aktualny w momencie pisania.
>>> import string
>>> string.digits
'0123456789'
>>> import random
>>> random.SystemRandom().choice(string.digits)
'8'
>>> random.SystemRandom().choice(string.digits)
'1'
>>> random.SystemRandom().choice(string.digits)
'8'
>>> random.SystemRandom().choice(string.digits)
'5'
Zamiast string.digits
, range
może być użyty w przypadku niektórych innych odpowiedzi, być może wraz ze zrozumieniem. Mieszaj i dopasowuj według swoich potrzeb.
OpenTURNS pozwala nie tylko symulować losowe liczby całkowite, ale także definiować skojarzony rozkład ze UserDefined
zdefiniowaną klasą.
Poniżej symuluje 12 wyników dystrybucji.
import openturns as ot
points = [[i] for i in range(10)]
distribution = ot.UserDefined(points) # By default, with equal weights.
for i in range(12):
x = distribution.getRealization()
print(i,x)
To drukuje:
0 [8]
1 [7]
2 [4]
3 [7]
4 [3]
5 [3]
6 [2]
7 [9]
8 [0]
9 [5]
10 [9]
11 [6]
Nawiasy są dostępne, ponieważ x
są Point
w 1 wymiarze. Łatwiej byłoby wygenerować 12 wyników w jednym wezwaniu do getSample
:
sample = distribution.getSample(12)
wyprodukowałby:
>>> print(sample)
[ v0 ]
0 : [ 3 ]
1 : [ 9 ]
2 : [ 6 ]
3 : [ 3 ]
4 : [ 2 ]
5 : [ 6 ]
6 : [ 9 ]
7 : [ 5 ]
8 : [ 9 ]
9 : [ 5 ]
10 : [ 3 ]
11 : [ 2 ]
Więcej szczegółów na ten temat znajduje się tutaj: http://openturns.github.io/openturns/master/user_manual/_generated/openturns.UserDefined.html
Miałem z tym więcej szczęścia dla Pythona 3.6
str_Key = ""
str_RandomKey = ""
for int_I in range(128):
str_Key = random.choice('0123456789')
str_RandomKey = str_RandomKey + str_Key
Wystarczy dodać znaki, takie jak „ABCD” i „abcd” lub „^! ~ = -> <”, aby zmienić pulę znaków, z której można pobierać, zmienić zakres, aby zmienić liczbę generowanych znaków.