Cách tạo số ngẫu nhiên với độ dài cụ thể trong python


105

Giả sử tôi cần một số có 3 chữ số, vì vậy nó sẽ giống như sau:

>>> random(3)
563

or

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

Câu trả lời:


182

Để nhận một số ngẫu nhiên có 3 chữ số:

from random import randint
randint(100, 999)  # randint is inclusive at both ends

(giả sử bạn thực sự muốn nói đến ba chữ số, thay vì "tối đa ba chữ số".)

Để sử dụng một số chữ số tùy ý:

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)

Đầu ra:

33
124
5127

7
Với giải pháp này, bạn sẽ loại bỏ 10 ** (n-1) số khỏi nhóm ngẫu nhiên của mình
Nicu Surdu

5
@NicolaeSurdu: Vâng, đó là lý do tại sao tôi nói rằng giả sử bạn thực sự muốn nói là ba chữ số, thay vì "tối đa ba chữ số".
RichieHindle

3
037 nó là một số có 3 chữ số, nhỏ hơn 100 :). Ý tôi là vậy. Nhưng yeah, cho một ứng dụng phi-xổ số, giải pháp của bạn là tốt;)
Nicu Surdu

@NicolaeSurdu Làm thế nào mà snipet này có thể cho bạn kết quả là 037 ??? đó là một randint từ (100-1000) nếu n == 3
moldovean

3
@moldovean Đọc từ đầu :). Ý tôi là tôi muốn con số đó và giải pháp này sẽ không cung cấp cho bạn những con số lên đến số chữ số đó mà là chính xác số chữ số đó. Đó là điều tồi tệ của tôi, tôi đã bỏ sót mệnh đề trong ngoặc đơn.
Nicu Surdu

41

Nếu bạn muốn nó dưới dạng một chuỗi (ví dụ: một số điện thoại có 10 chữ số), bạn có thể sử dụng điều này:

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

'' .join (str (randint (0, 9)) for _ in range (n))
Mike Fogel

13

Nếu bạn cần một số có 3 chữ số và muốn 001-099 là các số hợp lệ, bạn vẫn nên sử dụng randrange / randint vì nó nhanh hơn các lựa chọn thay thế. Chỉ cần thêm các số 0 cần thiết trước khi chuyển đổi thành một chuỗi.

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)

Ngoài ra, nếu bạn không muốn lưu số ngẫu nhiên dưới dạng int, bạn có thể làm điều đó dưới dạng oneliner:

'{:03}'.format(random.randrange(1, 10**3))

python 3.6+ only oneliner:

f'{random.randrange(1, 10**3):03}'

Kết quả đầu ra ví dụ ở trên là:

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

Được thực hiện như một chức năng:

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 có được tính là chữ số đầu tiên có thể có? Nếu vậy, thì bạn cần random.randint(0,10**n-1). Nếu không random.randint(10**(n-1),10**n-1),. Và nếu số 0 không bao giờ được phép, thì bạn sẽ phải từ chối rõ ràng các số có số 0 trong đó hoặc vẽ các n random.randint(1,9)số.

Ngoài ra: điều thú vị là randint(a,b)sử dụng "lập chỉ mục" có phần không phải là pythonic để lấy một số ngẫu nhiên a <= n <= b. Người ta có thể mong đợi nó hoạt động như thế nào rangevà tạo ra một số ngẫu nhiên a <= n < b. (Lưu ý khoảng trên đóng.)

Với những câu trả lời trong các ý kiến về randrange, lưu ý rằng chúng có thể được thay thế bằng sạch random.randrange(0,10**n), random.randrange(10**(n-1),10**n)random.randrange(1,10).


@Andrew: a <= n <= btôi cũng ngạc nhiên. Tôi bực bội khi phải thêm số tiền đó -1vào mã của mình. :-)
RichieHindle

1
randint@Andrew - thật hài hước , mã Python cho (nó nằm trong Lib / random.py) thực sự chỉ gọi randrange(a, b+1)!
Daniel G

4

Bạn có thể viết cho mình một hàm nhỏ để làm những gì bạn muốn:

import random
def randomDigits(digits):
    lower = 10**(digits-1)
    upper = 10**digits - 1
    return random.randint(lower, upper)

Về cơ bản, 10**(digits-1)cung cấp cho bạn số chữ số {chữ số} nhỏ nhất và 10**digits - 1cung cấp cho bạn số chữ số {chữ số} lớn nhất (xảy ra là số chữ số {chữ số + 1} nhỏ nhất trừ đi 1!). Sau đó, chúng tôi chỉ lấy một số nguyên ngẫu nhiên từ phạm vi đó.


0

Tôi thực sự thích câu trả lời của RichieHindle, tuy nhiên tôi thích câu hỏi như một bài tập. Đây là một triển khai brute force bằng cách sử dụng chuỗi :)

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

Từ tài liệu chính thức , có vẻ như phương thức sample () không thích hợp cho mục đích này?

import random

def random_digits(n):
    num = range(0, 10)
    lst = random.sample(num, n)
    print str(lst).strip('[]')

Đầu ra:

>>>random_digits(5)
2, 5, 1, 0, 4

0

Bạn có thể tạo một hàm sử dụng danh sách int, biến đổi trong chuỗi để nối và ép kiểu int lại, giống như sau:

import random

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

nó không tạo ra các số có độ dài cụ thể :(
Prometheus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.