Ada dua cara yang jelas untuk menghasilkan angka acak dari 0 hingga 9 dengan Python. Seseorang dapat menghasilkan angka floating point acak antara 0 dan 1, kalikan dengan 10, dan bulatkan. Atau, seseorang dapat menggunakan random.randint
metode ini.
import random
def random_digit_1():
return int(10 * random.random())
def random_digit_2():
return random.randint(0, 9)
Saya ingin tahu tentang apa yang akan terjadi jika seseorang menghasilkan angka acak antara 0 dan 1, dan menyimpan digit terakhir . Saya tidak selalu berharap distribusinya seragam, tetapi saya menemukan hasilnya cukup mengejutkan.
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)
Keluaran:
Counter({1: 84206,
5: 130245,
3: 119433,
6: 129835,
8: 101488,
2: 100861,
9: 84796,
4: 129088,
7: 120048})
Histogram ditunjukkan di bawah ini. Perhatikan bahwa 0 tidak muncul, karena trailing nol terpotong. Tetapi adakah yang bisa menjelaskan mengapa angka 4, 5, dan 6 lebih umum daripada yang lainnya? Saya menggunakan Python 3.6.10, tetapi hasilnya serupa di Python 3.8.0a4.
str
mengubahnya menjadi basis-10 yang pasti akan menimbulkan masalah. misalnya 1-bit mengambang mantissa b0 -> 1.0
dan b1 -> 1.5
. "Digit terakhir" akan selalu 0
atau 5
.
random.randrange(10)
bahkan lebih jelas, IMHO. random.randint
(yang memanggil di random.randrange
bawah tenda) adalah tambahan nanti untuk random
modul untuk orang yang tidak mengerti bagaimana rentang bekerja dengan Python. ;)
randrange
sebenarnya berada di urutan kedua, setelah mereka memutuskan bahwa randint
antarmuka adalah kesalahan.