Có hai cách rõ ràng để tạo một chữ số ngẫu nhiên từ 0 đến 9 trong Python. Người ta có thể tạo một số dấu phẩy động ngẫu nhiên trong khoảng từ 0 đến 1, nhân với 10 và làm tròn xuống. Ngoài ra, người ta có thể sử dụng random.randint
phương pháp.
import random
def random_digit_1():
return int(10 * random.random())
def random_digit_2():
return random.randint(0, 9)
Tôi tò mò về những gì sẽ xảy ra nếu một người tạo ra một số ngẫu nhiên trong khoảng từ 0 đến 1 và giữ chữ số cuối cùng . Tôi không nhất thiết mong đợi sự phân phối là thống nhất, nhưng tôi thấy kết quả khá đáng ngạc nhiên.
from random import random, seed
from collections import Counter
seed(0)
counts = Counter(int(str(random())[-1]) for _ in range(1_000_000))
print(counts)
Đầu ra:
Counter({1: 84206,
5: 130245,
3: 119433,
6: 129835,
8: 101488,
2: 100861,
9: 84796,
4: 129088,
7: 120048})
Một biểu đồ được hiển thị dưới đây. Lưu ý rằng 0 không xuất hiện, vì các số 0 ở cuối được cắt bớt. Nhưng bất cứ ai cũng có thể giải thích tại sao các chữ số 4, 5 và 6 phổ biến hơn các chữ số còn lại? Tôi đã sử dụng Python 3.6.10, nhưng kết quả tương tự trong Python 3.8.0a4.
str
chuyển đổi nó thành cơ sở 10 bị ràng buộc gây ra vấn đề. ví dụ: mantissa phao 1 bit b0 -> 1.0
và b1 -> 1.5
. "Chữ số cuối" sẽ luôn là 0
hoặc 5
.
random.randrange(10)
thậm chí còn rõ ràng hơn, IMHO. random.randint
(gọi random.randrange
dưới mui xe) là một bổ sung sau này cho random
mô-đun dành cho những người không hiểu cách hoạt động của phạm vi trong Python. ;)
randrange
thực sự đứng thứ hai, sau khi họ quyết định randint
giao diện là một lỗi.