วิธีสร้างตัวเลขสุ่มด้วยความยาวเฉพาะใน python


105

สมมติว่าฉันต้องการตัวเลข 3 หลักดังนั้นมันจะเป็นดังนี้:

>>> random(3)
563

or

>>> random(5)
26748
>> random(2)
56

คำตอบ:


183

ในการรับหมายเลข 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

7
ด้วยวิธีนี้คุณจะกำจัดตัวเลข 10 ** (n-1) ออกจากพูลแบบสุ่มของคุณ
Nicu Surdu

5
@NicolaeSurdu: ใช่นั่นคือเหตุผลที่ฉันบอกว่าสมมติว่าคุณหมายถึงตัวเลขสามหลักจริงๆแทนที่จะเป็น "มากถึงสามหลัก"
RichieHindle

3
037 เป็นตัวเลข 3 หลักเล็กกว่า 100 :) นั่นคือสิ่งที่ฉันหมายถึง. แต่ใช่สำหรับแอปพลิเคชันที่ไม่ใช่ลอตเตอรีโซลูชันของคุณก็ใช้ได้)
Nicu Surdu

@NicolaeSurdu snipet นี้ให้ผลลัพธ์ของ 037 ได้ยังไง ??? มันเป็นค่าแรนด์จาก (100 ถึง 1,000) ถ้า n == 3
moldovean

3
@moldovean อ่านจากด้านบน :). ฉันหมายความว่าฉันต้องการตัวเลขนั้นและวิธีนี้จะไม่ให้ตัวเลขถึงจำนวนหลักนั้น แต่เป็นจำนวนหลักนั้น มันเป็นเรื่องไม่ดีของฉันฉันพลาดประโยคในวงเล็บ
Nicu Surdu

41

หากคุณต้องการให้เป็นสตริง (เช่นหมายเลขโทรศัพท์ 10 หลัก) คุณสามารถใช้สิ่งนี้:

n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])

'' .join (str (randint (0, 9)) สำหรับ _ in range (n))
Mike Fogel

13

หากคุณต้องการหมายเลข 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}'

ตัวอย่างผลลัพธ์ข้างต้น ได้แก่ :

  • '026'
  • '255'
  • '512'

นำไปใช้เป็นฟังก์ชัน:

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_}}'

5

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รหัสพิเศษนั้นในรหัสของฉัน :-)
RichieHindle

1
@Andrew - พอสนุกแล้วรหัส Python สำหรับrandint(อยู่ใน Lib / random.py) ก็โทรมาrandrange(a, b+1)จริงๆ!
Daniel G

4

คุณสามารถเขียนฟังก์ชันเล็กน้อยเพื่อทำสิ่งที่คุณต้องการ:

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!) จากนั้นเราก็สุ่มจำนวนเต็มจากช่วงนั้น


0

ฉันชอบคำตอบของ 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)

0

จากเอกสารอย่างเป็นทางการดูเหมือนว่าวิธีการตัวอย่าง () จะไม่เหมาะสมสำหรับวัตถุประสงค์นี้หรือไม่?

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

0

คุณสามารถสร้างฟังก์ชั่นที่ใช้รายการ int แปลงเป็นสตริงเพื่อเชื่อมต่อและโยนทำ int อีกครั้งดังนี้:

import random

def generate_random_number(length):
    return int(''.join([str(random.randint(0,10)) for _ in range(length)]))

มันไม่ได้สร้างตัวเลขที่มีความยาวเฉพาะ :(
Prometheus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.