Das große Random() Missverständnis

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Das große Random() Missverständnis

      The Great Random() Debate von Jodder (GMC)

      übersetzt von Windapple

      Die random() ist eine der am meisten missverstandenen Funktionen im GM. Neulinge beachten nicht, dass sie Kommazahlen ausgibt, die ihr Spiel negativ beeinflussen können.

      Sie posten dann und fragen was falsch ist:

      Beispiel: Wie bekomme ich eine Zahl zwischen 1 und 10 (beide Grenzen inklusive).

      Typischerweise werden 3 Antworten geschrieben:
      round(random(9))+1
      ceil(random(10))
      floor(random(10))+1

      Es gibt Probleme mit der round() Lösung, da sie keine gerade Zahl wiedergibt, aber darum geht es in diesem Post nicht.

      Es geht um das potentielle Problem in der ceil(random(10)) Lösung.

      Hier ist das Problem:
      Random(10) gibt einen Wert zwischen 0.000000000000000 und 9.99999999999999 (inklusive der 15 Nachkommastellen) zurück. Die wahrscheinlichkeit von 0.00000000000000 ist eine Milliarde zu eins, aber genug Zeit vorrausgesetzt, wird es wie jedes mögliche Ereignis irgendwann geschehen. Wie oft ist das nun bei einer Wahrscheinlichkeit von eine Milliarde zu 1?

      Es wurde unzählige Male erklärt, aber die Missverständnisse kommen immer noch vor.

      Ich habe mich schließlich dazu entschlossen ein Programm zu schreiben, welches testet wie oft (oder ob überhaupt) random 0.00000000000 zurückgibt. Das Programm läuft auf meinem 3.2 GHz Rechner mit Hyper Threading, und war in der Lage ~10,000 Zufallszahlen pro Step (30fps) oder ~18 Millionen pro Minute zu errechnen.

      Hier ist der Code:

      GML-Quellcode

      1. it+=1;
      2. for (i=0;i<10000;i+=1) {
      3. if (ceil(random(1)) = 0) {
      4. global.iter=it*10000+i;
      5. instance_create(100,100,obj_rand0_found);
      6. global.stop_time=current_time;
      7. break;
      8. }
      9. }



      Es wird 10.000 Mal wiederholt. Das Statement:
      if (ceil(random(1)) = 0)
      wird nur wahr wenn random exakt 0.000000000 zurückgibt, dabei wird ein Objekt erstellt, das anzeigt wie lange es gedauert hat, und wieviele Durchläufe es gab.

      Random gibt 0 zurück

      Ich ließ das Programm über Nacht laufen und überprüfte am nächsten Morgen den Zustand, und random gab tatsächlich 0 zurück.

      Es trat nach dem prüfen von 1.402.998.272 zufälligen Zahlen auf, dass über 8 Stunden dauerte.

      Wenn du unbedingt ceil(random(10)) benutzen willst, dann tu das, es besteht die Chance das dein Programm niemals in dieses potentielle Problem kommen wird, nunja, zumindest nicht bis Millionen Menschen dein Spiel stundelang spielen. Aber wenn du den anderen etwas lehren willst, rege dich nicht darüber auf das sie dich korrigieren werden.


      Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.
      "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
      - Joseph Weizenbaum
    • Benutzer online 1

      1 Besucher