Python'da belirli uzunlukta rastgele sayı nasıl oluşturulur


106

Diyelim ki 3 basamaklı bir sayıya ihtiyacım var, bu nedenle şöyle bir şey olurdu:

>>> random(3)
563

or

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

Yanıtlar:


186

Rastgele 3 basamaklı bir sayı almak için:

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

("üç haneye kadar" değil, gerçekten üç haneyi kastettiğinizi varsayarsak.)

Rastgele sayıda basamak kullanmak için:

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)

Çıktı:

33
124
5127

7
Bu çözümle rastgele havuzunuzdan 10 ** (n-1) sayıyı
eleyeceksiniz

5
@NicolaeSurdu: Evet, bu yüzden "üç haneye kadar" değil, gerçekten üç haneyi kastettiğinizi varsayarak söyledim.
RichieHindle

3
037 100'den küçük 3 haneli bir sayıdır :). Demek istediğim şey o. Ama evet, piyango dışı bir başvuru için çözümünüz gayet iyi;)
Nicu Surdu

@NicolaeSurdu Bu snippet size nasıl 037 sonucunu verebilir ??? n == 3 ise (100'den 1000'e) bir randint
moldovean

3
@moldovean Yukarıdan okuyun :). Demek istediğim, bu numarayı istedim ve bu çözüm size o sayıya kadar rakamlar vermeyecek, tam olarak bu rakamlardan ziyade. Benim hatamdı, parantez içindeki maddeyi kaçırdım.
Nicu Surdu

42

Bir dizi olarak istiyorsanız (örneğin, 10 basamaklı bir telefon numarası) şunu kullanabilirsiniz:

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

3 basamaklı bir sayıya ihtiyacınız varsa ve 001-099'un geçerli sayı olmasını istiyorsanız, alternatiflerden daha hızlı olduğu için yine de randrange / randint kullanmalısınız. Bir dizeye dönüştürürken sadece gerekli olan sıfırları ekleyin.

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)

Alternatif olarak, rastgele sayıyı int olarak kaydetmek istemiyorsanız, bunu bir oneliner olarak yapabilirsiniz:

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

python 3.6+ yalnızca oneliner:

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

Yukarıdakilerin örnek çıktıları:

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

Bir işlev olarak uygulandı:

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 olası bir ilk basamak olarak sayılır mı? Eğer öyleyse, ihtiyacın var random.randint(0,10**n-1). Değilse random.randint(10**(n-1),10**n-1),. Ve sıfıra asla izin verilmezse, içinde sıfır olan sayıları açıkça reddetmeniz veyan random.randint(1,9) sayıları .

Bir kenara: randint(a,b)rastgele bir sayı elde etmek için biraz pitonik olmayan "indeksleme" kullanması ilginçtir a <= n <= b. Bunun gibi çalışıp rangerastgele bir sayı üretmesi beklenebilirdi.a <= n < b . (Kapalı üst aralığa dikkat edin.)

Hakkında da açıklamalarda bulunan tepkiler göz önüne alındığında randrangebu süpürge ile değiştirilebilir o notta, random.randrange(0,10**n), random.randrange(10**(n-1),10**n)ve random.randrange(1,10).


@Andrew: a <= n <= bBeni de şaşırttı. Bunu koduma fazladan eklemek zorunda kaldım -1. :-)
RichieHindle

1
@Andrew - komik bir şekilde, Python kodu randint(Lib / random.py içinde) aslında sadece çağırıyor randrange(a, b+1)!
Daniel G

4

İstediğinizi yapmak için kendinize küçük bir işlev yazabilirsiniz:

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

Temel olarak, 10**(digits-1)size en küçük {basamak} basamaklı sayıyı 10**digits - 1verir ve size en büyük {basamak} basamaklı sayıyı verir (en küçük {basamak + 1} basamaklı sayı eksi 1'dir!). Sonra bu aralıktan rastgele bir tamsayı alırız.


0

RichieHindle'ın cevabını gerçekten beğendim, ancak soruyu bir egzersiz olarak sevdim. İşte dizeleri kullanarak kaba kuvvet uygulaması :)

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

Gönderen Resmi belgelerin , değil örneği () metodu bu amaç için uygun olduğunu görünüyor?

import random

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

Çıktı:

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

0

Bir int listesini tüketen, dizgeyi birleştirmek için dönüştüren ve do int'i tekrar kullanan bir işlev oluşturabilirsiniz, bunun gibi bir şey:

import random

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

belirli bir uzunlukta sayı
üretmiyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.