มีสองวิธีที่ชัดเจนในการสร้างตัวเลขสุ่มจาก 0 ถึง 9 ใน Python เราสามารถสร้างจำนวนจุดลอยตัวแบบสุ่มระหว่าง 0 ถึง 1 คูณด้วย 10 และปัดเศษลง อีกวิธีหนึ่งสามารถใช้random.randint
วิธีการ
import random
def random_digit_1():
return int(10 * random.random())
def random_digit_2():
return random.randint(0, 9)
ฉันอยากรู้ว่าจะเกิดอะไรขึ้นถ้ามีคนสร้างตัวเลขสุ่มระหว่าง 0 ถึง 1 และเก็บตัวเลขสุดท้ายไว้ ฉันไม่ได้คาดหวังว่าการแจกจ่ายจะเหมือนกัน แต่ฉันพบว่าผลลัพธ์ค่อนข้างน่าประหลาดใจ
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)
เอาท์พุท:
Counter({1: 84206,
5: 130245,
3: 119433,
6: 129835,
8: 101488,
2: 100861,
9: 84796,
4: 129088,
7: 120048})
ฮิสโตแกรมแสดงไว้ด้านล่าง โปรดทราบว่า 0 ไม่ปรากฏเนื่องจากศูนย์ต่อท้ายถูกตัดทอน แต่ทุกคนสามารถอธิบายได้ไหมว่าทำไมตัวเลข 4, 5 และ 6 ถึงเป็นสามัญมากกว่าที่เหลือ? ฉันใช้ Python 3.6.10 แต่ผลลัพธ์คล้ายกันใน Python 3.8.0a4
str
แปลงเป็นฐาน 10 ซึ่งถูกผูกไว้เพื่อทำให้เกิดปัญหา เช่น 1 บิตลอย mantissa และb0 -> 1.0
b1 -> 1.5
"การหลักสุดท้าย" จะเป็นหรือ0
5
random.randrange(10)
ชัดเจนยิ่งขึ้น IMHO random.randint
(ซึ่งเรียกrandom.randrange
ภายใต้ประทุน) เป็นส่วนเพิ่มเติมในภายหลังrandom
สำหรับผู้ที่ไม่เข้าใจวิธีการทำงานของช่วงใน Python ;)
randrange
จริง ๆ แล้วมาสองหลังจากพวกเขาตัดสินใจว่าrandint
อินเทอร์เฟซเป็นข้อผิดพลาด