สมมติว่าฉันต้องการตัวเลข 3 หลักดังนั้นมันจะเป็นดังนี้:
>>> random(3)
563
or
>>> random(5)
26748
>> random(2)
56
สมมติว่าฉันต้องการตัวเลข 3 หลักดังนั้นมันจะเป็นดังนี้:
>>> random(3)
563
or
>>> random(5)
26748
>> random(2)
56
คำตอบ:
ในการรับหมายเลข 3 หลักแบบสุ่ม:
from random import randint
randint(100, 999) # randint is inclusive at both ends
(สมมติว่าคุณหมายถึงตัวเลขสามหลักจริงๆแทนที่จะเป็น "ไม่เกินสามหลัก")
ในการใช้ตัวเลขตามอำเภอใจ:
from random import randint
def random_with_N_digits(n):
range_start = 10**(n-1)
range_end = (10**n)-1
return randint(range_start, range_end)
print random_with_N_digits(2)
print random_with_N_digits(3)
print random_with_N_digits(4)
เอาท์พุต:
33
124
5127
หากคุณต้องการให้เป็นสตริง (เช่นหมายเลขโทรศัพท์ 10 หลัก) คุณสามารถใช้สิ่งนี้:
n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])
หากคุณต้องการหมายเลข 3 หลักและต้องการให้ 001-099 เป็นตัวเลขที่ถูกต้องคุณควรใช้ Randrange / randint เนื่องจากเร็วกว่าทางเลือกอื่น เพียงแค่เพิ่มศูนย์ที่จำเป็นนำหน้าเมื่อแปลงเป็นสตริง
import random
num = random.randrange(1, 10**3)
# using format
num_with_zeros = '{:03}'.format(num)
# using string's zfill
num_with_zeros = str(num).zfill(3)
หรือหากคุณไม่ต้องการบันทึกหมายเลขสุ่มเป็น int คุณสามารถทำได้ในรูปแบบ oneliner:
'{:03}'.format(random.randrange(1, 10**3))
python 3.6+ เฉพาะ oneliner:
f'{random.randrange(1, 10**3):03}'
ตัวอย่างผลลัพธ์ข้างต้น ได้แก่ :
นำไปใช้เป็นฟังก์ชัน:
import random
def n_len_rand(len_, floor=1):
top = 10**len_
if floor > top:
raise ValueError(f"Floor {floor} must be less than requested top {top}")
return f'{random.randrange(floor, top):0{len_}}'
0 นับเป็นตัวเลขหลักแรกที่เป็นไปได้หรือไม่? random.randint(0,10**n-1)
ถ้าเป็นเช่นนั้นแล้วคุณจะต้อง ถ้าไม่random.randint(10**(n-1),10**n-1)
. และถ้าไม่อนุญาตให้ใช้ศูนย์คุณจะต้องปฏิเสธตัวเลขที่มีศูนย์อยู่ในนั้นอย่างชัดเจนหรือวาดn
random.randint(1,9)
ตัวเลข
นอกเหนือ: มันเป็นที่น่าสนใจที่randint(a,b)
ใช้ค่อนข้างไม่ใช่ pythonic "การจัดทำดัชนี" a <= n <= b
เพื่อให้ได้ตัวเลขสุ่ม อาจจะมีใครคิดว่ามันจะทำงานเหมือนและผลิตจำนวนสุ่มrange
a <= n < b
(สังเกตช่วงบนปิด)
ได้รับการตอบสนองในการแสดงความคิดเห็นเกี่ยวกับrandrange
ทราบว่าสิ่งเหล่านี้สามารถถูกแทนที่ด้วยการทำความสะอาดrandom.randrange(0,10**n)
, และrandom.randrange(10**(n-1),10**n)
random.randrange(1,10)
a <= n <= b
แปลกใจเหมือนกัน ฉันไม่พอใจที่ต้องใส่-1
รหัสพิเศษนั้นในรหัสของฉัน :-)
randint
(อยู่ใน Lib / random.py) ก็โทรมาrandrange(a, b+1)
จริงๆ!
คุณสามารถเขียนฟังก์ชันเล็กน้อยเพื่อทำสิ่งที่คุณต้องการ:
import random
def randomDigits(digits):
lower = 10**(digits-1)
upper = 10**digits - 1
return random.randint(lower, upper)
โดยทั่วไป10**(digits-1)
จะให้ตัวเลข {digit} -digit ที่เล็กที่สุดและ10**digits - 1
ให้ {digit} -digit number ที่ใหญ่ที่สุด (ซึ่งจะเป็น {digit + 1} - เลขหลักที่เล็กที่สุดลบ 1!) จากนั้นเราก็สุ่มจำนวนเต็มจากช่วงนั้น
ฉันชอบคำตอบของ RichieHindle มาก แต่ฉันชอบคำถามนี้เป็นการออกกำลังกาย นี่คือการใช้กำลังดุร้ายโดยใช้สตริง :)
import random
first = random.randint(1,9)
first = str(first)
n = 5
nrs = [str(random.randrange(10)) for i in range(n-1)]
for i in range(len(nrs)) :
first += str(nrs[i])
print str(first)
จากเอกสารอย่างเป็นทางการดูเหมือนว่าวิธีการตัวอย่าง () จะไม่เหมาะสมสำหรับวัตถุประสงค์นี้หรือไม่?
import random
def random_digits(n):
num = range(0, 10)
lst = random.sample(num, n)
print str(lst).strip('[]')
เอาท์พุต:
>>>random_digits(5)
2, 5, 1, 0, 4
คุณสามารถสร้างฟังก์ชั่นที่ใช้รายการ int แปลงเป็นสตริงเพื่อเชื่อมต่อและโยนทำ int อีกครั้งดังนี้:
import random
def generate_random_number(length):
return int(''.join([str(random.randint(0,10)) for _ in range(length)]))