Cara menghasilkan nomor acak dengan panjang tertentu di python

105

Katakanlah saya membutuhkan angka 3 digit, jadi itu akan menjadi seperti ini:

>>> random(3)
563

or

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

Jawaban:

182

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
RichieHindle
sumber
7
Dengan solusi ini, Anda akan menghilangkan 10 ** (n-1) nomor dari kumpulan acak Anda
Nicu Surdu
5
@NicolaeSurdu: Ya, itulah mengapa saya mengatakan dengan asumsi Anda benar-benar bermaksud tiga digit, bukan "hingga tiga digit".
RichieHindle
3
037 itu angka 3 digit, lebih kecil dari 100 :). Itu yang saya maksud. Tapi ya, untuk aplikasi non-lotere, solusi Anda baik-baik saja;)
Nicu Surdu
@NicolaeSurdu Bagaimana snipet ini bisa memberi Anda hasil 037 ??? Ini adalah randint dari (100 hingga 1000) jika n == 3
moldovean
3
@moldovean Baca dari atas :). Maksud saya, saya ingin nomor itu dan solusi ini tidak akan memberi Anda angka hingga jumlah digit itu tetapi lebih tepatnya dari jumlah digit itu. Itu adalah kesalahanku, aku melewatkan klausa di dalam kurung.
Nicu Surdu
41

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)])
osman
sumber
".join (str (randint (0, 9)) untuk _ dalam jangkauan (n))
Mike Fogel
13

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:

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

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_}}'
Brian
sumber
5

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).

Andrew Jaffe
sumber
@ Andrew: a <= n <= bmengejutkan saya juga. Saya benci harus memasukkan ekstra itu ke -1dalam kode saya. :-)
RichieHindle
1
@Andrew - lucunya, kode Python untuk randint(ada di Lib / random.py) sebenarnya hanya memanggil randrange(a, b+1)!
Daniel G
4

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 - 1menghasilkan {digit} digit angka terbesar (yang merupakan {digit + 1} digit angka terkecil dikurangi 1!). Kemudian kami hanya mengambil bilangan bulat acak dari kisaran itu.

Daniel G
sumber
0

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)
moldovean.dll
sumber
0

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
kerwei
sumber
0

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)]))
Andre Machado
sumber
itu tidak menghasilkan angka dengan panjang tertentu :(
Prometheus