Câu trả lời:
Để 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
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)])
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à:
Đượ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_}}'
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 range
và 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)
và random.randrange(1,10)
.
a <= n <= b
tôi cũng ngạc nhiên. Tôi bực bội khi phải thêm số tiền đó -1
vào mã của mình. :-)
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)
!
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 - 1
cung 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 đó.
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)
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
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)]))