Lựa chọn, mẫu và các lựa chọn để chọn ngẫu nhiên các phần tử từ danh sách bằng Python.

Kinh doanh

Các hàm lựa chọn (), mẫu () và các lựa chọn () trong mô-đun ngẫu nhiên của thư viện chuẩn Python có thể được sử dụng để chọn và truy xuất ngẫu nhiên các phần tử từ danh sách, tuple, chuỗi hoặc đối tượng chuỗi khác (lấy mẫu ngẫu nhiên).

lựa chọn () nhận một phần tử duy nhất, mẫu () và các lựa chọn () nhận danh sách nhiều phần tử. sample () là chiết xuất không thể khôi phục mà không có bản sao, lựa chọn () là chiết xuất có thể phục hồi với các bản sao.

Thông tin sau được cung cấp ở đây.

  • Chọn ngẫu nhiên một phần tử.:random.choice()
  • Chọn ngẫu nhiên nhiều phần tử (không trùng lặp):random.sample()
  • Chọn ngẫu nhiên nhiều phần tử (có trùng lặp):random.choices()
  • Sửa hạt giống số ngẫu nhiên

Chọn ngẫu nhiên một phần tử.:random.choice()

Với chức năng select () của mô-đun ngẫu nhiên, một phần tử được chọn ngẫu nhiên từ danh sách và có thể được truy xuất.

import random

l = [0, 1, 2, 3, 4]

print(random.choice(l))
# 1

Điều tương tự cũng áp dụng cho bộ giá trị và chuỗi. Trong trường hợp chuỗi, một ký tự được chọn.

print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy

print(random.choice('abcde'))
# b

Lỗi nếu danh sách trống, bộ hoặc chuỗi được chỉ định làm đối số.

# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence

Chọn ngẫu nhiên nhiều phần tử (không trùng lặp):random.sample()

Với mẫu hàm () của mô-đun ngẫu nhiên, bạn có thể lấy ngẫu nhiên nhiều phần tử từ một danh sách. Không có sự trùng lặp của các phần tử (trích xuất không thể phục hồi).

Đối số đầu tiên là danh sách và đối số thứ hai là số phần tử được truy xuất. Danh sách được trả lại.

import random

l = [0, 1, 2, 3, 4]

print(random.sample(l, 3))
# [2, 4, 0]

print(type(random.sample(l, 3)))
# <class 'list'>

Nếu đối số thứ hai được đặt thành 1, danh sách có một phần tử cũng được trả về; nếu nó được đặt thành 0, danh sách trống. Nếu đối số thứ hai là 1, một danh sách có một phần tử được trả về; nếu nó là 0, một danh sách trống được trả về; nếu đối số đầu tiên nhiều hơn số phần tử trong danh sách, thì sẽ xảy ra lỗi.

print(random.sample(l, 1))
# [3]

print(random.sample(l, 0))
# []

# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative

Nếu đối số đầu tiên là một bộ hoặc một chuỗi, thì những gì được trả về vẫn là một danh sách.

print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']

print(random.sample('abcde', 2))
# ['b', 'e']

Nếu bạn muốn quay lại một tuple hoặc chuỗi, hãy sử dụng tuple (), join ().

print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')

print(''.join(random.sample('abcde', 2)))
# dc

Lưu ý rằng giá trị không được đánh giá, vì vậy nếu danh sách hoặc bộ giá trị ban đầu chứa các phần tử có cùng giá trị, thì có khả năng cùng một giá trị sẽ được chọn.

l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]

print(random.sample(l_dup, 3))
# [3, 1, 1]

Nếu bạn muốn tránh các giá trị trùng lặp, bạn có thể sử dụng set () để chuyển nó thành một tập hợp (loại tập hợp) và chỉ trích xuất các phần tử duy nhất, sau đó sử dụng sample ().

print(set(l_dup))
# {0, 1, 2, 3}

print(random.sample(set(l_dup), 3))
# [1, 3, 2]

Chọn ngẫu nhiên nhiều phần tử (có trùng lặp):random.choices()

Các lựa chọn chức năng của mô-đun ngẫu nhiên () cho phép bạn lấy ngẫu nhiên nhiều phần tử từ một danh sách và không giống như sample (), nó cho phép các phần tử trùng lặp được chọn.

options () là một hàm được thêm vào trong Python 3.6. Nó không có sẵn trong các phiên bản trước đó.

Đối số k chỉ định số phần tử được truy xuất. Cho phép sao chép, vì vậy số phần tử được truy xuất có thể lớn hơn số phần tử trong danh sách ban đầu.

Vì k là đối số chỉ từ khóa, nên cần phải xác định một từ khóa, chẳng hạn như k = 3.

import random

l = [0, 1, 2, 3, 4]

print(random.choices(l, k=3))
# [2, 1, 0]

print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]

Giá trị mặc định của k là 1; nếu nó bị bỏ qua, một danh sách có 1 phần tử sẽ được trả về.

print(random.choices(l))
# [1]

Các trọng số của đối số có thể được sử dụng để chỉ định trọng số (xác suất) mà mỗi phần tử sẽ được chọn và kiểu của các phần tử trong danh sách có thể là int hoặc float.

print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]

print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]

Đối số cum_weights cũng có thể được chỉ định làm trọng số tích lũy. Cum_weights trong mã mẫu sau đây tương đương với trọng số đầu tiên ở trên.

print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]

Mặc định cho cả trọng số đối số và cum_weights là Không, có nghĩa là mỗi phần tử được chọn với cùng một xác suất.

Nếu độ dài (số phần tử) của trọng số đối số hoặc cum_weights khác với danh sách ban đầu, thì sẽ xảy ra lỗi.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_

Nó cũng là một lỗi khi chỉ định trọng số và cum_weights cùng một lúc.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights

Chúng tôi đã chỉ định một danh sách làm đối số đầu tiên làm ví dụ trong mã mẫu cho đến nay, nhưng điều này cũng áp dụng cho các bộ giá trị và chuỗi.

Sửa hạt giống số ngẫu nhiên

Bằng cách cung cấp một số nguyên tùy ý cho hạt giống hàm của mô-đun ngẫu nhiên (), hạt giống số ngẫu nhiên có thể được cố định và trình tạo số ngẫu nhiên có thể được khởi tạo.

Sau khi khởi tạo với cùng một hạt giống, các phần tử luôn được chọn theo cùng một cách.

random.seed(0)
print(random.choice(l))
# 3

random.seed(0)
print(random.choice(l))
# 3
Copied title and URL