2016-11-08 2 views
0

Ich möchte random.uniform verwenden, um eine float zwischen etwa [-2, 2] zu erzeugen, aber nicht 0 erzeugen, das ist, wie ich es in einer Schleife zu tun,Python random.uniform nicht generieren 0

from random import uniform 

flag = True 

while flag: 
    if uniform(-2, 2) is not 0: 
     flag = False 

Ich frage mich, ist gibt es einen besseren Weg, es zu tun?

prost

Antwort

1

Das ist mehr etwas für Code Review, aber sehr kurz:

from random import uniform 

while True: 
    if uniform(-2, 2) != 0.0: 
     break 

ist wahrscheinlich der mehr Pythonic/standard Weg, um diesen (Standard zu tun, wie das in diesem Muster in anderen Sprachen auftritt auch).

Es ist selten, dass eine flag Variable notwendig ist, um aus einer (while) Schleife auszubrechen. Vielleicht bei Verwendung einer Doppelschleife.

Hinweis: Ich änderte Ihre is not-!= und Ihre 0 zu 0.0 (letztere ist so, dass es klar ist, sind wir einen Schwimmer mit einem Schwimmer zu vergleichen).
Weil Sie eine float mit einer int vergleichen, so werden sie nie das gleiche Element sein. Außerdem Zahlen vergleichen is verwendet, ist eine schlechte Idee:

>>> 2*3 is 6 # this may work, but don't rely on it 
True 
>>> 10*60 is 600 # this obviously doesn't work 
False 
>>> 0 is 0 # sure, this works... 
True 
>>> 0.0 is 0 # but this doesn't: float vs int 
False 

Natürlich die eigentliche Frage zu beantworten, ob es andere Möglichkeiten gibt, diese Zufallszahlen zu erzeugen: wahrscheinlich ein Dutzend.

  • Mit einer Liste Verständnis in einer Liste Verständnis *:

    [val for val in [uniform(-2, 2) for i in range(10)] if val != 0] 
    
  • Mit numpy:

    vals = uniform(-2, 2, 10) 
    vals = vals[vals!=0] 
    

* Ich will es nicht verschachtelt nennen, da ich das zu einem etwas anderen Doppellistenverständnis gehört.

Verwandte Themen