Saya sedang mengerjakan bagian AI dari game menebak. Saya ingin AI memilih huruf acak dari daftar ini. Saya melakukannya sebagai satu set sehingga saya dapat dengan mudah menghapus huruf dari daftar seperti yang ditebak dalam permainan dan karena itu tidak lagi tersedia untuk ditebak lagi.
dikatakan set
objek tidak dapat diindeks. Bagaimana saya bisa mengatasi ini?
import random
aiTurn=True
while aiTurn == True:
allLetters = set(list('abcdefghijklmnopqrstuvwxyz'))
aiGuess=random.choice(allLetters)
print (aiGuess)
Jawaban:
>>> random.sample(set('abcdefghijklmnopqrstuvwxyz'), 1) ['f']
Dokumentasi: https://docs.python.org/3/library/random.html#random.sample
sumber
[0]
di akhir sehingga pada dasarnya identik denganrandom.choice
(yang tidak mengembalikan nilainya dalam bentuk daftar)random.sample
lakukan secaratuple(population)
internal, jadirandom.choice(tuple(allLetters))
mungkin lebih baik.random.choice
. Jika set juga berubah saat Anda mengambil sampel maka mungkin Anda tidak harus menggunakan set sama sekali. Jika Anda mengetahui hash yang ditempati dalam set dan ukuran bucket, akan mudah untuk menulis fungsi pengambilan sampel ...Anda harus menggunakan
random.choice(tuple(myset))
, karena lebih cepat dan bisa dibilang terlihat lebih bersih daripadarandom.sample
. Saya menulis yang berikut untuk menguji:import random import timeit bigset = set(random.uniform(0,10000) for x in range(10000)) def choose(): random.choice(tuple(bigset)) def sample(): random.sample(bigset,1)[0] print("random.choice:", timeit.timeit(choose, setup="global bigset", number=10000)) # 1.1082136780023575 print("random.sample:", timeit.timeit(sample, setup="global bigset", number=10000)) # 1.1889629259821959
Dari angka-angka itu sepertinya
random.sample
butuh waktu 7% lebih lama.sumber
random.sample
berubah dari lebih lambat daripadarandom.choice
menjadi lebih cepat daripada saat ukuran yang ditetapkan tumbuh (titik persilangan berada di antara ukuran set 100k-500k). Artinya, semakin besar himpunannya, semakin besar kemungkinannya untukrandom.sample
menjadi lebih cepat.