Jawaban:
Untuk mendapatkan nomor 3 digit acak:
from random import randint
randint(100, 999) # randint is inclusive at both ends
(anggap saja yang Anda maksud adalah tiga digit, bukan "hingga tiga digit".)
Untuk menggunakan jumlah digit yang berubah-ubah:
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)
Keluaran:
33
124
5127
Jika Anda menginginkannya sebagai string (misalnya, nomor telepon 10 digit) Anda dapat menggunakan ini:
n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])
Jika Anda memerlukan angka 3 digit dan ingin 001-099 menjadi angka yang valid, Anda masih harus menggunakan randrange / randint karena lebih cepat daripada alternatif. Cukup tambahkan angka nol sebelumnya yang diperlukan saat mengonversi menjadi string.
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)
Alternatifnya, jika Anda tidak ingin menyimpan nomor acak sebagai int, Anda dapat melakukannya sebagai satu-satunya:
'{:03}'.format(random.randrange(1, 10**3))
python 3.6+ hanya oneliner:
f'{random.randrange(1, 10**3):03}'
Contoh keluaran di atas adalah:
Diterapkan sebagai fungsi:
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_}}'
Apakah 0 dihitung sebagai kemungkinan digit pertama? Jika demikian, maka Anda membutuhkannya random.randint(0,10**n-1)
. Jika tidak random.randint(10**(n-1),10**n-1)
,. Dan jika nol tidak pernah diizinkan, maka Anda harus secara eksplisit menolak angka dengan nol di dalamnya, atau menggambar n
random.randint(1,9)
angka.
Selain: menarik bahwa randint(a,b)
menggunakan "pengindeksan" agak non-pythonic untuk mendapatkan nomor acak a <= n <= b
. Orang mungkin berharap itu berfungsi seperti range
, dan menghasilkan nomor acak a <= n < b
. (Perhatikan interval atas tertutup.)
Mengingat tanggapan di komentar tentang randrange
, perhatikan bahwa ini dapat diganti dengan pembersih random.randrange(0,10**n)
, random.randrange(10**(n-1),10**n)
dan random.randrange(1,10)
.
a <= n <= b
mengejutkan saya juga. Saya benci harus memasukkan ekstra itu ke -1
dalam kode saya. :-)
randint
(ada di Lib / random.py) sebenarnya hanya memanggil randrange(a, b+1)
!
Anda bisa menulis sendiri sedikit fungsi untuk melakukan apa yang Anda inginkan:
import random
def randomDigits(digits):
lower = 10**(digits-1)
upper = 10**digits - 1
return random.randint(lower, upper)
Pada dasarnya, 10**(digits-1)
memberikan Anda {digit} digit angka terkecil, dan 10**digits - 1
menghasilkan {digit} digit angka terbesar (yang merupakan {digit + 1} digit angka terkecil dikurangi 1!). Kemudian kami hanya mengambil bilangan bulat acak dari kisaran itu.
Saya sangat menyukai jawaban RichieHindle, namun saya menyukai pertanyaan itu sebagai latihan. Berikut implementasi brute force menggunakan string :)
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)
Dari dokumentasi resmi , bukankah metode sample () cocok untuk tujuan ini?
import random
def random_digits(n):
num = range(0, 10)
lst = random.sample(num, n)
print str(lst).strip('[]')
Keluaran:
>>>random_digits(5)
2, 5, 1, 0, 4
Anda bisa membuat fungsi yang menggunakan daftar int, mengubah string menjadi concatenate dan cast do int lagi, seperti ini:
import random
def generate_random_number(length):
return int(''.join([str(random.randint(0,10)) for _ in range(length)]))