Würfel

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

..... Hier noch als weitere Ergänzung die wxPython-Variante:

Code: Alles auswählen

import wx
from random import randint

app = wx.App()

app_win = wx.Frame(None, size=(100,100))
button = wx.Button(app_win, label=str(1))
app_win.Bind(wx.EVT_BUTTON,
    lambda event: button.SetLabel(str(randint(1,6))), button)

app_win.Show()
app.MainLoop()
Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

lunar hat geschrieben:
Da randint() außerdem langsamer [...] ist.
Mich würde interessieren, wie du darauf kommst ...
Weil es auf meinem System so ist - mag woanders anders sein:

Code: Alles auswählen

from time import time
from random import randint, randrange, random

def test():
    t0 = time()
    for k in xrange(10**6):
        n = randint(1,6)
    print time()-t0
    t0 = time()
    for k in xrange(10**6):
        n = randrange(1,7)
    print time()-t0
    t0 = time()
    for k in xrange(10**6):
        n = int(random()*6)+1
    print time()-t0

test()
Python 2.5:

Code: Alles auswählen

6.84303498268
5.88890886307
1.54791784286
Python 2.6:

Code: Alles auswählen

9.91317200661
7.94979190826
2.14650988579
Python 3.0 (syntaktisch angepasst):

Code: Alles auswählen

10.7660419941
9.33516716957
2.65259599686
Jython 2.2

Code: Alles auswählen

17.42199993133545
14.800999879837036
9.039999961853027
Jython 2.5rc

Code: Alles auswählen

19.5909998417
15.2780001163
3.43799996376
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Mich würde interessieren, wie du darauf kommst ...
Ein Blick in die Quellen zeigt warum:

Code: Alles auswählen

    def randint(self, a, b):
        """Return random integer in range [a, b], including both end points.
        """

        return self.randrange(a, b+1)
Ich finde randint trotzdem schöner. Die Verbindung dieser Funktion zu range und den slice-Operationen sehe ich einfach nicht. Es ist eine ganz normale Funktion die halt genau das bietet was benötigt wird. Wenns zeitkritisch wird, taugen die beiden Funktionen eh nichts. Dann würde ich gleich ein ganzes Feld von Zufallsvariaben mit numpy erzeugen.

MFG HerrHagen
lunar

Ich kenne die Quellen von "randint()", daher habe ich ja auch nachgefragt. "randint()" selbst ist nicht langsam, was Numerix da gemessen hat, sind einzig die Kosten eines Funktionsaufrufs in Python und einer Addition in Python. Mit diesem Argument könnte man gleich auf Funktionen verzichten ...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

lunar hat geschrieben:Ich kenne die Quellen von "randint()", daher habe ich ja auch nachgefragt. "randint()" selbst ist nicht langsam, was Numerix da gemessen hat, sind einzig die Kosten eines Funktionsaufrufs in Python und einer Addition in Python. Mit diesem Argument könnte man gleich auf Funktionen verzichten ...
Diese Argumentation kann ich nicht nachvollziehen.
Fakt ist doch:
- randint() ist langsamer als randrange() - ob nun durch einen Funktionsaufruf und/oder eine Addition, spielt doch keine Rolle
- randrange() ist leistungsfähiger durch die optionale Schrittweite
- randrange() fügt sich durch den ausgeschlossenen Wert für die obere Intervallgrenze besser in das bestehende Konzept von range/slicing
- randrange() ist nicht komplizierter einzusetzen zu verstehen o.ä. als randint()

Was bleibt also als Argument für randint(), außer, dass man sich daran gewöhnt hat und es nach meinem Eindruck häufiger in Quelltexten auftaucht als randrange()?

Vor allem: Wieso wird so ein Wind gegen randrange() gemacht? Was ist denn schlecht an randrange()? Oder liegt es einfach daran, dass es einigen weniger vertraut ist als randint() und darum nicht gut gelitten ist?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Edit: Doppelpost durch Hänger in der Boardsoftware ...
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

numerix hat geschrieben:Edit: Doppelpost durch Hänger in der Boardsoftware ...
Siehst du das "x"-Button neben "edit" und "zitat"? Vor ein paar Sekunden hättest das noch benutzen können ;-)
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Ich hab nichts gegen randrange. Nimm es. Ich würde auch keinen großen Wind darum machen. Das ist IMHO eine reine Geschmacksfrage.
BlackJack

@numerix: `randint()` ist IMHO einfach die verständlichere Alternative um eine Zahl von 1 bis 6 zu würfeln. Das hat nichts mit "Slicing" oder Indexen zu tun.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

BlackJack hat geschrieben:@numerix: `randint()` ist IMHO einfach die verständlichere Alternative um eine Zahl von 1 bis 6 zu würfeln. Das hat nichts mit "Slicing" oder Indexen zu tun.
Meine Logik ist so: range(a,b,c) kennt jeder. randrange(a,b,c) liefert (de facto) einfach aus range(a,b,c) einen zufälligen Wert.
Noch einfacher und schlüssiger geht es m.E. nicht. Bei randint(a,b) hingegen muss ich mir extra merken, dass b mit drin ist.
BlackJack

Das muss man sich nicht "extra" merken. Man muss es sich *nur* merken. Die Annahme, dass die Obergrenze nicht mit enthalten ist, kann man jedenfalls nicht machen, nur weil Indexe und `range()` das so machen, weil das etwas völlig anderes ist.
Clockworx
User
Beiträge: 2
Registriert: Montag 1. Juni 2009, 18:40

Wow ich bin echt positiv überrascht von diesem Forum!
dass so viel Hilfe in so kurzer Zeit kommen würde hätte ich echt nicht erwartet.
Vielen Dank an euch, ihr habt mir echt geholfen!
Ich werd mir das Turtorial jetzt mal genauer vornehmen...
lunar

numerix hat geschrieben:Noch einfacher und schlüssiger geht es m.E. nicht.
Wenn du in einer "Mensch ärgere dich nicht"-Runde erzählst, dass du jetzt gleich eine Zahl zwischen 1 und 7 würfeln wirst, wirst du drei verwunderte Blicke ernten ;)

Schlüssig und einfach das Verhalten von "randrange()" nur, wenn man das Verhalten von Slicing und "range()" verallgemeinert. Das ist aber nun mal kein allgemein definiertes Verhalten, sondern betrifft erstmal nur Slicing und "range()". Deine Argumentation ist doch gerade: "Die Funktion ist überflüssig, weil sie sich nicht so verhält wie die Funktion, die ich kenne." Das ist doch irgendwo Unsinn, der Sinn von "randint()" liegt doch gerade darin, dass es sich anders verhält, um der natürlichen Sprache (siehe oben) zu entsprechen.

Der Mensch, insbesondere wenn er kein Programmierer ist, würfelt doch im Allgemeinen eine Zahl zwischen eins und sechs, und nicht zwischen eins und sieben ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Clockworx hat geschrieben:Ich werd mir das Turtorial jetzt mal genauer vornehmen...
Bin mal gespannt, wann der erste von "Torturial" spricht ...

Was randint()/randrange() angeht: Ich verstehe euch (BlackJack, lunar), aber verstehe nicht, dass ihr meiner bestechenden Logik nicht folgen wollt ... :D

Wahrscheinlich war das bei der Entwicklung des random-Moduls genau so: Da gab es die, die sich so an range() und slices gewöhnt hatten, das für sie ein randint() wie es jetzt ist, nicht in Frage kam (auch wenn es mit range/slices nichts zu tun hat); und die nicht-programmierenden Mensch-ärgere-dich-nicht-Spieler, die mit einer 7 beim Würfeln nichts anfangen können. Und am Ende konnte sich keiner durchsetzen ...
Antworten