Kể từ Python v3.6
, random.choices
có thể được sử dụng để trả về một list
trong các phần tử có kích thước được chỉ định từ dân số đã cho với các trọng số tùy chọn.
random.choices(population, weights=None, *, cum_weights=None, k=1)
dân số : list
chứa những quan sát độc đáo. (Nếu trống, tăng IndexError
)
trọng lượng : chính xác hơn trọng lượng tương đối cần thiết để thực hiện lựa chọn.
cum_weights : trọng số tích lũy cần thiết để thực hiện các lựa chọn.
k : kích thước ( len
) của đầu list
ra. (Mặc định len()=1
)
Vài cảnh báo:
1) Nó sử dụng lấy mẫu có trọng số với sự thay thế để các vật phẩm được rút ra sẽ được thay thế sau đó. Bản thân các giá trị trong chuỗi trọng số không quan trọng, nhưng tỷ lệ tương đối của chúng thì không.
Không giống như np.random.choice
chỉ có thể đảm nhận các xác suất là trọng số và cũng phải đảm bảo tổng các xác suất riêng lẻ lên tới 1 tiêu chí, không có quy định nào như vậy ở đây. Miễn là chúng thuộc về loại số ( int/float/fraction
ngoại trừ Decimal
loại), chúng vẫn sẽ hoạt động.
>>> 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) Nếu không chỉ định trọng số hay cum_weights , các lựa chọn được thực hiện với xác suất bằng nhau. Nếu một chuỗi trọng số được cung cấp, nó phải có cùng độ dài với chuỗi dân số .
Chỉ định cả trọng số và cum_weights tăng a TypeError
.
>>> random.choices(["white", "green", "red"], k=10)
['white', 'white', 'green', 'red', 'red', 'red', 'white', 'white', 'white', 'green']
3) cum_weights thường là kết quả của itertools.accumulate
chức năng thực sự tiện dụng trong các tình huống như vậy.
Từ các tài liệu liên kết:
Trong nội bộ, các trọng số tương đối được chuyển đổi thành các trọng số tích lũy trước khi thực hiện các lựa chọn, do đó việc cung cấp các trọng số tích lũy giúp tiết kiệm công việc.
Vì vậy, việc cung cấp weights=[12, 12, 4]
hoặc cum_weights=[12, 24, 28]
cho trường hợp giả định của chúng tôi tạo ra kết quả tương tự và trường hợp sau có vẻ nhanh hơn / hiệu quả hơn.
random.choices
với các cuộc gọi riêng lẻ. Nếu bạn cần nhiều kết quả ngẫu nhiên, điều thực sự quan trọng là chọn tất cả chúng cùng một lúc bằng cách điều chỉnhnumber_of_items_to_pick
. Nếu bạn làm như vậy, đó là một thứ tự cường độ nhanh hơn.