2016-06-15 10 views
0

Ich habe Probleme mit dem folgenden Stück Code:bekommen eine Zufallszahl jedes Mal in einem Skript

from random import randint 
class character(): 
    __init__(self): 
     #init stuff here 
    def luck(self, Luck = randint(0, 3)): 
     return Luck 

Ich habe diese Methode in meinem Skript mehrmals aufrufen, für mehrere Instanzen, erhalten eine verschiedene Anzahl jedes Mal. Das Problem, das ich habe, ist, dass, immer wenn ich diese Methode nenne, egal aus welcher Instanz, ich immer das gleiche Ergebnis bekomme. Zum Beispiel in dem folgenden Code:

Foo = character() 
Bar = character() 
for foobar in range(3): 
    print(Foo.luck(), Bar.luck()) 

ich als meine Ausgabe erhalten würde:

1 1 
1 1 
1 1 

By the way, in meinem Code, habe ich randint(0, 3) als Argument für die luck() Methode, weil, In einigen speziellen Situationen möchte ich selbst Werte zuweisen.

Zurück zum Punkt, wie kann ich jedes Mal eine andere Nummer bekommen?

Antwort

3

Dies ist eine Definition für die Glücksfunktion. Wenn der Benutzer eine Nummer angibt, wird diese zurückgegeben. Wenn stattdessen kein Argument angegeben wird, wird Luck von randint gesetzt und dieser zufällige Wert zurückgegeben.

def luck(self, Luck = None): 
    if Luck is None: 
     Luck = randint(0,3) 
    return Luck 
+1

nicht 0 würde True zurückgeben, daher ist es besser, einen Vergleich direkt mit None durchzuführen. – user1308345

+0

Das ist ein guter Punkt! Danke für den Vorschlag, ich habe meine Antwort aktualisiert. – nbryans

2

In Python werden die Standardausdrücke, die die Standardwerte für Funktionsargumente festlegen, nur einmal ausgeführt. Dies bedeutet, dass, sobald Sie die luck Methode definieren, welcher Wert randint() ausspucken das erste Mal für alle Aufrufe bleiben wird.

Um die Methode wird aufgerufen, eine neue Zufallszahl jedes Mal zu bekommen, müssen Sie es im Inneren des Körpers des Verfahrens nennen:

class Character(object): 
    @staticmethod # required if you're not accepting `self` 
    def luck(): 
     return randint(0, 3) 

Dies wird wie erwartet.

+0

Ich glaube nicht, dass dies den Fall löst, wenn er den Wert selbst zuweisen möchte (obwohl es überflüssig erscheint, einen Wert nur zu übergeben, um ihn sofort zurückzugeben). – nbryans

+0

Ich denke, dass OP auch Standard-Argument für die "Glück" -Funktion wollte. – user1308345

+0

Das dachte ich mir auch, aber das würde den Zweck, eine Zufallszahl zurückgegeben zu haben, vereiteln, also nahm an, dass es einfach so passiert ist (klar, OP lernt noch). – Anonymous

0

Sie können für ein Standardargument None oder etwas verwenden, prüfen Sie, ob Sie None bekam und wenn Sie getan haben - randint() nennen (wenn nicht nur zurückgeben, was Sie bekommen haben).
Wenn Sie randint() in der Funktion Verzögerung verwenden, wird es nur einmal randomisiert.

Verwandte Themen