Yanıtlar:
kullanım random.choice()
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
İçin şifreli olarak güvenli rasgele seçimler (örneğin bir wordlist bir parola oluşturmak için) kullanımısecrets.choice()
import secrets
foo = ['battery', 'correct', 'horse', 'staple']
print(secrets.choice(foo))
secrets
Python 3.6'da yeni, Python'un eski sürümlerinde random.SystemRandom
sınıfı kullanabilirsiniz :
import random
secure_random = random.SystemRandom()
print(secure_random.choice(foo))
random.sample(lst, n)
Bir listeden birden fazla öğeyi rastgele seçmek veya bir kümeden bir öğe seçmek istiyorsanız, random.sample
bunun yerine kullanmanızı öneririm .
import random
group_of_items = {1, 2, 3, 4} # a sequence or set will work here.
num_to_select = 2 # set the number to select here.
list_of_random_items = random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1]
Ancak listeden yalnızca tek bir öğe çekiyorsanız, seçim yapmak daha az karmaşıktır, çünkü örnek kullanmak random.sample(some_list, 1)[0]
yerine sözdizimi olacaktır random.choice(some_list)
.
Ne yazık ki, seçim sadece sekanslardan (listeler veya tuples gibi) tek bir çıktı için çalışır. Rağmen random.choice(tuple(some_set))
bir kümeden tek bir öğe almak için bir seçenek olabilir.
EDIT: Sırları Kullanma
Birçoğunun işaret ettiği gibi, daha güvenli sahte örneklere ihtiyacınız varsa, sırlar modülünü kullanmalısınız:
import secrets # imports secure module.
secure_random = secrets.SystemRandom() # creates a secure random object.
group_of_items = {1, 2, 3, 4} # a sequence or set will work here.
num_to_select = 2 # set the number to select here.
list_of_random_items = secure_random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1]
DÜZENLEME: Pitonik Tek Katlı
Birden fazla öğe seçmek için daha pythonic bir astar istiyorsanız, ambalajı açmayı kullanabilirsiniz.
import random
first_random_item, second_random_item = random.sample(group_of_items, 2)
secrets
3.6 sürümünde Python standart kütüphanesine BTW modülü eklendi python.org/dev/peps/pep-0506
Dizine de ihtiyacınız varsa, random.randrange
from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
Python 3.6'dan itibaren, şifreleme veya güvenlik kullanımları için modüle secrets
tercih edilen modülü kullanabilirsiniz random
.
Listeden rastgele bir öğe yazdırmak için:
import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))
Rastgele bir dizin yazdırmak için:
print(secrets.randbelow(len(foo)))
Ayrıntılar için, bkz. PEP 506 .
Boş olana kadar bir listeden rastgele alınan öğeleri kaldırmak için bir komut dosyası öneriyorum:
A işaretini koruyun set
ve choice
liste boşalana kadar rastgele alınan öğeyi (ile ) kaldırın .
s=set(range(1,6))
import random
while len(s)>0:
s.remove(random.choice(list(s)))
print(s)
Üç koşu üç farklı cevap verir:
>>>
set([1, 3, 4, 5])
set([3, 4, 5])
set([3, 4])
set([4])
set([])
>>>
set([1, 2, 3, 5])
set([2, 3, 5])
set([2, 3])
set([2])
set([])
>>>
set([1, 2, 3, 5])
set([1, 2, 3])
set([1, 2])
set([1])
set([])
random.shuffle
list
foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1
Python 2'de:
random_items = random.sample(population=foo, k=number_of_samples)
Python 3'te:
random_items = random.choices(population=foo, k=number_of_samples)
random.choices
Değişim sırasında yedek olduğunu unutmayın random.sample
.
numpy
çözüm: numpy.random.choice
Bu soru için, kabul edilen cevapla aynı şekilde çalışır ( import random; random.choice()
), ancak ekledim çünkü programcı numpy
zaten (benim gibi) içe aktarmış olabilir ve ayrıca iki yöntem arasında gerçek kullanım durumunuzu ilgilendirebilecek bazı farklılıklar var .
import numpy as np
np.random.choice(foo) # randomly selects a single item
Tekrarlanabilirlik için şunları yapabilirsiniz:
np.random.seed(123)
np.random.choice(foo) # first call will always return 'c'
Olarak döndürülen bir veya daha fazla öğenin örnekleri array
için şu size
argümanı iletin:
np.random.choice(foo, 5) # sample with replacement (default)
np.random.choice(foo, 5, False) # sample without replacement
Listeden rastgele bir öğe nasıl seçilir?
Aşağıdaki listeye sahip olduğumu varsayın:
foo = ['a', 'b', 'c', 'd', 'e']
Bu listeden rastgele bir öğe almanın en basit yolu nedir?
Eğer gerçekten rastgele yakın istiyorsanız , o zaman ben secrets.choice
standart kütüphaneden (Python 3.6 Yeni.) Öneririz:
>>> from secrets import choice # Python 3 only
>>> choice(list('abcde'))
'c'
Yukarıda Python 2'de daha önce mevcut olan yöntemle modülden bir SystemRandom
nesne kullanarak önceki tavsiyemle eşdeğerdir :random
choice
>>> import random # Python 2 compatible
>>> sr = random.SystemRandom()
>>> foo = list('abcde')
>>> foo
['a', 'b', 'c', 'd', 'e']
Ve şimdi:
>>> sr.choice(foo)
'd'
>>> sr.choice(foo)
'e'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'b'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'c'
>>> sr.choice(foo)
'c'
Deterministik bir sözde seçim istiyorsanız, choice
işlevi kullanın (aslında bir Random
nesne üzerinde bağlı bir yöntemdir ):
>>> random.choice
<bound method Random.choice of <random.Random object at 0x800c1034>>
Rastgele gibi görünüyor, ancak aslında tekrar tekrar yeniden kalıplayıp tekrarlayamadığımızı görebileceğimiz aslında değil:
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
Bu random.choice gerçekten rastgele olup olmadığı ile ilgili değildir. Tohumu sabitlerseniz, tekrarlanabilir sonuçlar elde edersiniz - ve bu tohum için tasarlanmıştır. Bir tohumu SystemRandom'a da iletebilirsiniz.
sr = random.SystemRandom(42)
Evet, bunu bir "tohum" argümanı olarak iletebilirsiniz, ancak SystemRandom
nesnenin bunu görmezden geldiğini göreceksiniz :
def seed(self, *args, **kwds):
"Stub method. Not used for a system random number generator."
return None
Eğer dizine ihtiyacınız varsa kullanın:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print int(random.random() * len(foo))
print foo[int(random.random() * len(foo))]
random.choice aynı şeyi yapıyor :)
random.choice(self, seq)
DİR return seq[int(self.random() * len(seq))]
.
randrange()
örneğin random.SystemRandom().randrange(3<<51)
önemli önyargı sergilediği anlamına geliyor . Ah ...
float
(IEEE double) sadece [0,1] 'de sınırlı sayıda değer alabilir. Random.random()
çıktısını geleneksel şekilde üretir: rastgele bir tamsayı seçin [0, 2**53)
ve bölün 2**53
(53, bir çiftteki bit sayısıdır). Yani random()
2 ** 53 eşdeğeri iki katına çıkar ve bunu N çıkış 2'ye eşitse N çıkışlarına eşit olarak bölebilirsiniz. Sapma küçük N için küçüktür, ama bkz collections.Counter(random.SystemRandom().randrange(3<<51)%6 for i in range(100000)).most_common()
. (Java'nın Random.nextInt () yöntemi bu önyargıyı önler.)
2**40
1099511627776'dan daha az bir şey , uygulamada önyargının önemli olmayacağı kadar küçük olurdu? Bu gerçekten belgelerde belirtilmelidir, çünkü eğer birisi titiz değilse, kodlarının bu kısmından sorun çıkmasını beklemeyebilirler.
random
kullanımları getrandbits
daha büyük bir sonuç üretmek için bitlerin uygun bir sayısını almak için randrange
s ( random.choice
Ayrıca kullanarak). Bu hem 2.7 hem de 3.5 için geçerlidir. Sadece kullandığı self.random() * len(seq)
zaman getrandbits
kullanılamaz. Düşündüğün aptalca şeyi yapmıyor.
Rastgele dizini tanımlayan bir değişkene sahip kod:
import random
foo = ['a', 'b', 'c', 'd', 'e']
randomindex = random.randint(0,len(foo)-1)
print (foo[randomindex])
## print (randomindex)
Bu değişken olmayan koddur:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print (foo[random.randint(0,len(foo)-1)])
Ve bu, kodu en kısa ve en akıllı şekilde yapar:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
(python 2.7)
Aşağıdaki kod, aynı öğeleri üretmeniz gerekip gerekmediğini gösterir. Ayrıca kaç tane numune almak istediğinizi de belirtebilirsiniz. Yöntem değişmeden orijinal nüfus bırakırken popülasyondan elemanları içeren yeni bir listesini verir. Sonuçta elde edilen liste seçim sırasına göre tüm alt dilimlerin geçerli rasgele örnekler olmasını sağlar.sample
import random as random
random.seed(0) # don't use seed function, if you want different results in each run
print(random.sample(foo,3)) # 3 is the number of sample you want to retrieve
Output:['d', 'e', 'a']
import random
my_list = [1, 2, 3, 4, 5]
num_selections = 2
new_list = random.sample(my_list, num_selections)
randIndex = random.sample(range(len(my_list)), n_selections)
randIndex.sort()
new_list = [my_list[i] for i in randIndex]
Bunu randint kullanarak da yapabiliriz.
from random import randint
l= ['a','b','c']
def get_rand_element(l):
if l:
return l[randint(0,len(l)-1)]
else:
return None
get_rand_element(l)
random.choice()
ve random.randrange()
?
None
kutuyu geçersiz "öğenin" bir istisnayı tetiklediği rastgele bir sonraki noktaya vurur; veya daha da kötüsü, bir istisna yerine yanlış bir program alıyorsunuz ve bunu bile bilmiyorsunuz.
Şunları yapabilirsiniz:
from random import randint
foo = ["a", "b", "c", "d", "e"]
print(foo[randint(0,4)])
random.choice(foo)
geri dönüş çağrısı yapmak iki farklı sonuç getirir mi?