Pada Python v3.6, random.choicesdapat digunakan untuk mengembalikan listelemen ukuran tertentu dari populasi tertentu dengan bobot opsional.
random.choices(population, weights=None, *, cum_weights=None, k=1)
populasi : listberisi pengamatan unik. (Jika kosong, naikkan IndexError)
bobot : Lebih tepatnya bobot relatif yang dibutuhkan untuk membuat pilihan.
cum_weights : bobot kumulatif diperlukan untuk membuat pilihan.
k : ukuran ( len) dari yang listakan dikeluarkan. (Default len()=1)
Beberapa Peringatan:
1) Itu menggunakan sampling tertimbang dengan penggantian sehingga barang yang ditarik akan diganti nanti. Nilai-nilai dalam urutan bobot itu sendiri tidak penting, tetapi rasio relatifnya tidak.
Tidak seperti np.random.choiceyang hanya dapat mengambil probabilitas sebagai bobot dan juga yang harus memastikan penjumlahan probabilitas individu hingga 1 kriteria, tidak ada peraturan seperti itu di sini. Selama mereka termasuk tipe numerik ( int/float/fractionkecuali Decimaltipe), ini akan tetap bekerja.
>>> import random
# weights being integers
>>> random.choices(["white", "green", "red"], [12, 12, 4], k=10)
['green', 'red', 'green', 'white', 'white', 'white', 'green', 'white', 'red', 'white']
# weights being floats
>>> random.choices(["white", "green", "red"], [.12, .12, .04], k=10)
['white', 'white', 'green', 'green', 'red', 'red', 'white', 'green', 'white', 'green']
# weights being fractions
>>> random.choices(["white", "green", "red"], [12/100, 12/100, 4/100], k=10)
['green', 'green', 'white', 'red', 'green', 'red', 'white', 'green', 'green', 'green']
2) Jika bobot atau cum_weights tidak ditentukan, pemilihan dilakukan dengan probabilitas yang sama. Jika urutan bobot disediakan, panjangnya harus sama dengan urutan populasi .
Menentukan bobot dan cum_weights memunculkan a TypeError.
>>> random.choices(["white", "green", "red"], k=10)
['white', 'white', 'green', 'red', 'red', 'red', 'white', 'white', 'white', 'green']
3) cum_weights biasanya merupakan hasil dari itertools.accumulatefungsi yang sangat berguna dalam situasi seperti itu.
Dari dokumentasi yang ditautkan:
Secara internal, bobot relatif dikonversi menjadi bobot kumulatif sebelum membuat pilihan, sehingga memasok bobot kumulatif akan menghemat pekerjaan.
Jadi, baik memasok weights=[12, 12, 4]atau cum_weights=[12, 24, 28]untuk kasus kami yang dibuat menghasilkan hasil yang sama dan yang terakhir tampaknya lebih cepat / efisien.
random.choicesuntuk panggilan individu. Jika Anda membutuhkan banyak hasil acak, sangat penting untuk memilih semuanya sekaligus dengan menyesuaikannumber_of_items_to_pick. Jika Anda melakukannya, ini adalah urutan besarnya lebih cepat.