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:
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
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)])
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ı:
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_}}'
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 range
rastgele 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 randrange
bu 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)
.
a <= n <= b
Beni de şaşırttı. Bunu koduma fazladan eklemek zorunda kaldım -1
. :-)
randint
(Lib / random.py içinde) aslında sadece çağırıyor randrange(a, b+1)
!
İ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 - 1
verir 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.
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)
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
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)]))