webentwicklung-frage-antwort-db.com.de

Wie generiert man eine Zufallszahl mit der spezifischen Länge in Python?

Nehmen wir an, ich brauche eine dreistellige Zahl, also wäre es etwa so: 

>>> random(3)
563

or

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

Um eine zufällige 3-stellige Nummer zu erhalten:

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

(Angenommen, Sie meinten wirklich drei Ziffern statt "bis zu drei Ziffern".)

So verwenden Sie eine beliebige Anzahl von Ziffern:

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)

Ausgabe:

33
124
5127
136
RichieHindle

Wenn Sie es als Zeichenfolge wünschen (z. B. eine 10-stellige Telefonnummer), können Sie Folgendes verwenden:

n = 10
''.join(["%s" % randint(0, 9) for num in range(0, n)])
22
osman

Zählt 0 als mögliche erste Ziffer? Wenn ja, dann brauchen Sie random.randint(0,10**n-1). Wenn nicht, random.randint(10**(n-1),10**n-1). Und wenn Null niemals erlaubt ist, müssen Sie Zahlen mit einer Null ausdrücklich ablehnen oder nrandom.randint(1,9)-Zahlen zeichnen.

Nebenbei: Es ist interessant, dass randint(a,b) etwas Nicht-Pythonische "Indizierung" verwendet, um eine Zufallszahl a <= n <= b zu erhalten. Man hätte erwarten können, dass es wie range funktioniert und eine Zufallszahl a <= n < b erzeugt. (Beachten Sie das geschlossene obere Intervall.)

Beachten Sie, dass die Antworten in den Kommentaren zu randrange durch die Bereinigungsprogramme random.randrange(0,10**n), random.randrange(10**(n-1),10**n) und random.randrange(1,10) ersetzt werden können.

5
Andrew Jaffe

Wenn Sie eine 3-stellige Nummer benötigen und 001-099 gültige Nummern sein möchten, sollten Sie dennoch randrange/randint verwenden, da dies schneller als andere Alternativen ist. Fügen Sie einfach die notwendigen vorangestellten Nullen hinzu, wenn Sie in einen String konvertieren.

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)

Wenn Sie die Zufallszahl nicht als int speichern möchten, können Sie dies auch als Oneliner tun:

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

nur Python 3.6+:

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

Beispielausgaben der obigen sind:

  • '026'
  • '255' 
  • '512'
3
Brian

Sie könnten sich selbst eine kleine Funktion schreiben, um das zu tun, was Sie wollen:

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

Grundsätzlich erhalten Sie mit 10**(digits-1) die kleinste {digit} -Digit-Nummer und 10**digits - 1 die größte {digit} -Digit-Nummer (die zufällig die kleinste {digit + 1} -Digit-Nummer minus 1! Dann nehmen wir einfach eine zufällige ganze Zahl aus diesem Bereich.

3
Daniel G

Wenn Sie nicht alle verschiedenen scheinbar zufälligen Befehle (wie ich) auswendig lernen möchten, können Sie immer Folgendes verwenden:

import random
Numbers = range(1, 10)
RandomNumber = random.choice(Numbers)
print(RandomNumber)
#returns a number
2
Matthew Miles

Ist aus der offiziellen Dokumentation nicht ersichtlich, dass die sample () - Methode für diesen Zweck geeignet ist?

import random

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

Ausgabe:

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

Die Antwort von RichieHindle hat mir wirklich gut gefallen, jedoch hat mir die Frage als Übung gefallen. Hier ist eine Brute-Force-Implementierung mit Strings :)

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
moldovean

Sie könnten eine Funktion erstellen, die eine Liste von int verbraucht, in Zeichenketten transformiert, um sie zu verketten und do int erneut umzusetzen, etwa

import random

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