Pada Python v3.6
, random.choices
dapat digunakan untuk mengembalikan list
elemen ukuran tertentu dari populasi tertentu dengan bobot opsional.
random.choices(population, weights=None, *, cum_weights=None, k=1)
populasi : list
berisi 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 list
akan 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.choice
yang 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/fraction
kecuali Decimal
tipe), 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.accumulate
fungsi 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.choices
untuk 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.