Yanıtlar:
Deneyin:
from random import randrange
print(randrange(10))
Daha fazla bilgi: http://docs.python.org/library/random.html#random.randrange
secrets
Daha iyi rasgele sayılar için modülü kullanın . Referans: docs.python.org/3/library/random.html
import random
print(random.randint(0,9))
random.randint(a, b)
<= N <= b olacak şekilde rastgele bir N tamsayısı döndürün.
Dokümanlar: https://docs.python.org/3.1/library/random.html#random.randint
randint(0,9)
asla 9 döndürmeyecek). Bu, çevrimiçi belgelere yansıtılmaz, ancak yerleşik yardımda bulunur.
Bunu dene:
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)
secrets
Modül Python 3.6 yenidir. Bu, random
şifreleme veya güvenlik kullanımları modülünden daha iyidir .
0-9 dahil aralığında bir tamsayıyı rastgele yazdırmak için:
from secrets import randbelow
print(randbelow(10))
Ayrıntılar için, bkz. PEP 506 .
Dizinin boyutunu seçin (bu örnekte, boyutu 20 olarak seçtim). Ve sonra aşağıdakileri kullanın:
import numpy as np
np.random.randint(10, size=(1, 20))
Aşağıdaki formun bir çıktısını görmeyi bekleyebilirsiniz ( her çalıştırdığınızda farklı rasgele tamsayılar döndürülür; bu nedenle çıktı dizisindeki tamsayıların aşağıdaki örnekten farklı olmasını bekleyebilirsiniz ).
array([[1, 6, 1, 2, 8, 6, 3, 3, 2, 5, 6, 5, 0, 9, 5, 6, 4, 5, 9, 3]])
Bunu deneyin random.shuffle
>>> import random
>>> nums = range(10)
>>> random.shuffle(nums)
>>> nums
[6, 3, 5, 4, 0, 1, 2, 9, 8, 7]
Aşağıdakilerden birini denerdim:
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. rastgele
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.> rastgele.
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]
hız:
► np.random.randint en hızlı , ardından np.random.uniform ve random.randrange . random.randint en yavaş .
► Hem np.random.randint ve np.random.uniform çok daha hızlı (~ 8-12 kat daha hızlı) random.randrange ve random.randint daha .
%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)
Notlar:
1.> np.random.randint yarı açık aralıkta [düşük, yüksek) rastgele tamsayılar üretir.
2.> np.random.uniform yarı açık aralıkta [düşük, yüksek) eşit olarak dağıtılmış sayılar üretir.
3.> rastgele. Aralık (durdur) aralıktan rastgele bir sayı oluşturur (start, stop, step).
4.> rastgele. İşaret (a, b) <= N <= b olacak şekilde rastgele bir N tamsayısı döndürür.
5.> astype (int) , numpy dizisini int veri türüne çevirir .
6.> beden = (15,) seçtim. Bu size = 15'lik bir uzunluk dizisi verecektir.
%timeit
Ortamınızda nasıl çalışır?
Sürekli sayılar olması randint
veya randrange
muhtemelen en iyi seçenek olması durumunda, ancak bir sekansta (yani a list
) birkaç farklı değeriniz varsa şunları da kullanabilirsiniz choice
:
>>> import random
>>> values = list(range(10))
>>> random.choice(values)
5
choice
sürekli olmayan bir örnekten bir öğe için de çalışır:
>>> values = [1, 2, 3, 5, 7, 10]
>>> random.choice(values)
7
Eğer "kriptografik olarak güçlü" ihtiyacınız varsa secrets.choice
, python 3.6 ve daha yenisinde de var :
>>> import secrets
>>> values = list(range(10))
>>> secrets.choice(values)
2
random.sample
. Değiştirme ile aşağıdakileri kullanarak bir kavrama kullanabilirsiniz choice
: örneğin yerine 3 rastgele değer içeren bir liste için:[choice(values) for _ in range(3)]
Birçok mesaj nasıl göstermek iken bir rasgele tamsayı, orijinal soru rasgele tamsayı oluşturmak için nasıl sorar lar (çoğul):
Python'da 0 ile 9 (dahil) arasında rastgele tamsayıları nasıl oluşturabilirim?
Açıklık için, burada birden fazla rasgele tamsayının nasıl elde edileceğini gösteririz.
verilmiş
>>> import random
lo = 0
hi = 10
size = 5
kod
Çoklu, Rastgele Tam Sayılar
# 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]
Rastgele Tam Sayı Örneği
# 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]
ayrıntılar
Bazı gönderiler, birden çok rasgele tamsayının nasıl oluşturulacağını gösterir . 1 Burada, zımni soruyu ele alan bazı seçenekler bulunmaktadır:
random.random
aralıkta rastgele bir şamandıra döndürür[0.0, 1.0)
random.randint
rastgele bir tamsayı döndürür N
.a <= N <= b
random.randrange
takma adrandint(a, b+1)
random.shuffle
bir diziyi yerinde karıştırırrandom.choice
boş olmayan diziden rastgele bir öğe döndürürrandom.choices
döndürür k
(yedek, Python 3.6+ ile)random.sample
döndürür k
(değiştirmeden): 2Ayrıca modüldeki örnekleri kullanarak R. Hettinger'in Chunking ve Aliasing konusundaki konuşmasına da bakınız random
.
Standart Kütüphane ve Numpy'deki bazı rastgele işlevlerin karşılaştırması:
| | 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) |
Ayrıca Numpy'deki birçok dağıtımdan birini rastgele tamsayı örneğine hızlı bir şekilde dönüştürebilirsiniz . 3
Örnekler
>>> 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 Yani @John Lawrence Aspden, @ST Mohammed, @SiddTheKid, @ user14372, @zangw, et al. 2 @prashanth bu modülde bir tamsayı gösterir. 3 @Siddharth Satpathy tarafından sunuldu
numpy kullanmak istiyorsanız aşağıdakileri kullanın:
import numpy as np
print(np.random.randint(0,10))
>>> import random
>>> random.randrange(10)
3
>>> random.randrange(10)
1
On örneğin bir listesini almak için:
>>> [random.randrange(10) for x in range(10)]
[9, 0, 4, 0, 5, 7, 4, 3, 6, 8]
0 ile 9 arasında rastgele tamsayılar oluşturma.
import numpy
X = numpy.random.randint(0, 10, size=10)
print(X)
Çıktı:
[4 8 0 4 9 6 9 9 0 7]
En iyi yol alma Rastgele işlevini kullanmaktır
import random
print(random.sample(range(10), 10))
veya herhangi bir kütüphane içe aktarımı olmadan:
n={}
for i in range(10):
n[i]=i
for p in range(10):
print(n.popitem()[1])
burada popitemler sözlükten rastgele bir değer çıkarır ve döndürür n
.
Bu daha matematiksel bir yaklaşımdır, ancak zamanın% 100'ünde çalışır:
Diyelim ki ve random.random()
arasında bir sayı oluşturmak için işlevi kullanmak istiyorsunuz . Bunu başarmak için aşağıdakileri yapmanız yeterlidir:a
b
num = (b-a)*random.random() + a;
Tabii ki, daha fazla sayı üretebilirsiniz.
Rastgele modülün dokümantasyon sayfasından :
Uyarı: Bu modülün sözde rasgele üreteçleri güvenlik amacıyla kullanılmamalıdır. Şifreleme açısından güvenli bir sözde rasgele sayı üretecine ihtiyacınız varsa os.urandom () veya SystemRandom kullanın.
Python 2.4'te tanıtılan SystemRandom , kriptografik olarak güvenli kabul edilir . Halen, yazı yazıldığı sırada geçerli olan Python 3.7.1'de mevcuttur.
>>> 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'
Yerine string.digits
, range
belki bir anlama ile birlikte başka bazı yanıtlar başına kullanılabilir. İhtiyaçlarınıza göre karıştırın ve eşleştirin.
OpenTURNS sadece rastgele tamsayıları simüle etmekle kalmayıp aynı zamanda UserDefined
tanımlanan sınıfla ilişkili dağılımı tanımlamaya izin verir .
Aşağıdakiler dağılımın 12 sonucunu simüle etmektedir.
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)
Bu yazdırır:
0 [8]
1 [7]
2 [4]
3 [7]
4 [3]
5 [3]
6 [2]
7 [9]
8 [0]
9 [5]
10 [9]
11 [6]
Çünkü parantez vardır x
a, Point
1-boyutta. 12 sonucu tek bir çağrıda üretmek daha kolay olacaktır getSample
:
sample = distribution.getSample(12)
üretecek:
>>> 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 ]
Bu konu hakkında daha fazla bilgi burada: http://openturns.github.io/openturns/master/user_manual/_generated/openturns.UserDefined.html
Bu konuda Python 3.6 için daha iyi şanslar vardı
str_Key = ""
str_RandomKey = ""
for int_I in range(128):
str_Key = random.choice('0123456789')
str_RandomKey = str_RandomKey + str_Key
Sadece çekilecek karakter havuzunu değiştirmek için 'ABCD' ve 'abcd' veya '^! ~ = -> <' gibi karakterler ekleyin, oluşturulan karakter sayısını değiştirmek için aralığı değiştirin.