Frage von MrKnowAll, 65

Zufällige Zahl in Python?

Ich würde gern wissen wie ich eine zufällige Zahl in dem Bereich von 2 - 12 in eine Variabel speicher, allerdings will ich nicht das die Zahlen 3, 8, 11, 7, 5, 9 oder 13 dabei sind. Also ich weiß wie es geht in dem Bereich von 2 - 12, aber ich weiß hält nicht wie ich die Zählen raus lassen kann.

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von TeeTier, Community-Experte für programmieren, 65

Die anderen Antworten scheinen mir recht naiv zu sein, bzw. "riechen" sehr nach Anfängerniveau. :)

Eine wirklich clevere Implementierung sieht so aus:

from random import choice as c
l = list(set(range(2,13)) ^ set((3,5,7,8,9,11)))
print(c(l))

Das gibt dir eine zufällige Zahl anhand deiner Vorgaben aus.

Effizienter geht es nicht mehr. Keine Schleifen, keine Bedingungen und nicht mal eine einzige Einrückung nötig. Außerdem werden nicht sinnlos unnötige Zufallszahlen in einer Schleife berechnet, die sich im Nachhinein bei einer Prüfung als falsch rausstellen. :)

Anstatt print() kannst du das c(l) auch an jede andere Stelle deines Programms einbauen, und es wird dir jedes mal eine zufällige Zahl aus deinem Pool liefern.

In einem richtigen Programm solltest du natürlich auf vernünftige Namen für die Bezeichner achten, denn "c" und "l" sind nur in obigem Beispiel aussagekräftig. Bei allem, was länger als 5 Zeilen ist, sollte man sich wirklich Gedanken um gute Bezeichner machen!

Viel Spaß noch mit Python! :)

Kommentar von W00dp3ckr ,

Hübsch. Aber das import choice as c würde ich mir nicht angewöhnen. Das ist gut für "nur ich muss es lesen"-Programme

Kommentar von TeeTier ,

Da gebe ich dir absolut Recht, und ich denke, das ist das gleiche Problem wie bei C++-Namespaces oder statischen Imports in Java.

Trotzdem sind viele meiner Python-Skripte sehr kurz und knapp gehalten, mit teilweise deutlich unter 20 Zeilen, wobei dann ein ...

from os.path import basename, isfile
# ...
if isfile(foo):
bar = basename(foo)

... viel mehr zur Übersichtlichkeit beiträgt, als ein ...

import os.path
# ...
if os.path.isfile(foo):
bar = os.path.basename(foo)

... und ich denke, das gilt auch für Dritte, die über meinen Quelltext stolpern.

Wie gesagt, bei sehr kurzen (!) Skripten! Wenn man natürlich erst durch 10 Seiten scrollen muss, um zu erkennen, dass eine Funktion aus einem anderen Modul importiert wird, anstatt irgendwo definiert zu sein, ist das natürlich etwas ganz anderes.

(Wobei in so einem Falle vermutlich eher die IDE helfen würde ... aber auch hier schmeiße ich für 5 Zeilen Code nicht extra ein Schwergewicht an, wenn es ein einfacher Editor auch tut)

Man muss eben einfach immer abwägen, was für die aktuelle Situation am sinnvollsten ist. Prinzipien sind zwar gut und schön, aber nur so lange sie wirklich helfen, und nicht um ihrer selbst willen. :)

Kommentar von W00dp3ckr ,

Offen gestanden hatte ich erst nach meinem Kommentar gesehen, dass Du es bist. Du weißt allgemein was Du tust (*lobhudelei off* ;-)). Aber auf das Problem hinweisen ist vielleicht allgemein nicht falsch.

Ich find übrigens basename(foo) sehr viel besser als b(f) ;-)

Kommentar von TeeTier ,

Danke schön! :)

Ich find übrigens basename(foo) sehr viel besser als b(f) ;-)

Dem schließe ich mich an! :)

Antwort
von DieAntwort2100, 54
#!/usr/bin/env python
# import random module
import random
# initialize
 randomrandom.seed()
# get random integer value between 1 and 1000
x = random.randint(1,1000)
# print random valueprint(x)

Das Ergebnis in if variable setze wenn eine der nicht gewollten zahlen auftrit Script wiederholen. 

Antwort
von ShmuelRotkraut, 43

Du könntest es so angehen: Eine Zufallszahl wird berechnet, dann überprüfst du mit if, ob es eine der unerwünschten ist. Wenn ja, dann generierst du eine neue. Ist zwar nicht sehr sauber, aber etwas besseres fällt mir nicht ein.

Antwort
von spaghetticode, 40

Setz den Zufallsgenerator in eine while-Schleife. Als Bedingung nimmst du eine boolesche Variable als Flag.

gueltig = False
while not gueltig:
# Zufallsgenerator hier

Nach Erzeugung einer Zahl kannst du dann mit einer if-Abfrage prüfen und dein Flag gegebenenfalls auf True setzen.

Antwort
von MrKnowAll, 34

*halt *Zahlen halt

Keine passende Antwort gefunden?

Fragen Sie die Community