Powiedzmy, że potrzebuję 3-cyfrowego numeru, więc wyglądałoby to tak:
>>> random(3)
563
or
>>> random(5)
26748
>> random(2)
56
Aby otrzymać losową 3-cyfrową liczbę:
from random import randint
randint(100, 999) # randint is inclusive at both ends
(zakładając, że naprawdę chodziło Ci o trzy cyfry, a nie o „maksymalnie trzy cyfry”).
Aby użyć dowolnej liczby cyfr:
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)
Wynik:
33
124
5127
Jeśli chcesz, aby był to ciąg (na przykład 10-cyfrowy numer telefonu), możesz użyć tego:
źródło
Jeśli potrzebujesz 3-cyfrowego numeru i chcesz, aby 001-099 były poprawnymi liczbami, nadal powinieneś używać randrange / randint, ponieważ jest szybszy niż alternatywy. Po prostu dodaj niezbędne poprzedzające zera podczas konwersji na ciąg.
Alternatywnie, jeśli nie chcesz zapisywać losowej liczby jako int, możesz to zrobić po prostu jako oneliner:
python 3.6+ tylko oneliner:
Przykładowe wyniki powyższego to:
Zaimplementowane jako funkcja:
źródło
Czy 0 liczy się jako możliwa pierwsza cyfra? Jeśli tak, to potrzebujesz
random.randint(0,10**n-1)
. Jeśli nierandom.randint(10**(n-1),10**n-1)
,. A jeśli zero nigdy nie jest dozwolone, będziesz musiał jawnie odrzucić liczby zawierające zero lub wylosowaćn
random.randint(1,9)
liczby.Na marginesie: interesujące jest to, że
randint(a,b)
używa nieco nie-pythonowego „indeksowania” do uzyskania liczby losoweja <= n <= b
. Można by się spodziewać, że będzie działać podobnierange
i wygeneruje liczbę losowąa <= n < b
. (Zwróć uwagę na zamknięty górny przedział).Biorąc pod uwagę odpowiedzi w komentarzach około
randrange
pamiętać, że mogą one zostać zastąpione przez czystszerandom.randrange(0,10**n)
,random.randrange(10**(n-1),10**n)
irandom.randrange(1,10)
.źródło
a <= n <= b
też mnie zaskoczył. Żałuję, że muszę umieszczać ten dodatek-1
w moim kodzie. :-)randint
(jest w Lib / random.py) w rzeczywistości po prostu wywołujerandrange(a, b+1)
!Możesz napisać sobie małą funkcję, która zrobi, co chcesz:
Zasadniczo,
10**(digits-1)
daje ci najmniejszą {cyfrę} -cyfrową liczbę i10**digits - 1
największą {cyfrę} -cyfrową liczbę (która jest najmniejszą {cyfra + 1} -cyfrową liczbą minus 1!). Następnie bierzemy losową liczbę całkowitą z tego zakresu.źródło
Bardzo podobała mi się odpowiedź RichieHindle, jednak spodobało mi się to pytanie jako ćwiczenie. Oto implementacja brutalnej siły przy użyciu ciągów znaków :)
źródło
Czy z oficjalnej dokumentacji nie wynika, że metoda sample () jest odpowiednia do tego celu?
Wynik:
źródło
Możesz stworzyć funkcję, która konsumuje listę int, przekształca w string w celu konkatenacji i rzutowania do int, coś takiego:
źródło