Kaii: Zufallszahl berechnen aber nur alle Stunden

Ich erstelle mir mittels mt_rand(0, 100) eine Zufallszahl innerhalb eines bestimmten Bereiches. Nun möchte ich aber gerne das diese zufallszahl nicht jedesmal neu erstellt wird, sondern nur jede Stunde. Geht das irgendwie?

Kai

  1. Hallo,

    Geht das irgendwie?

    kurze Antwort: klar geht das irgendwie.
    Was genau ist dir denn nicht klar?

    PHP hat Zeitfunktionen und beherrscht If-Abfragen.

    Gruß
    Kalk

  2. Moin!

    Ich erstelle mir mittels mt_rand(0, 100) eine Zufallszahl innerhalb eines bestimmten Bereiches. Nun möchte ich aber gerne das diese zufallszahl nicht jedesmal neu erstellt wird, sondern nur jede Stunde. Geht das irgendwie?

    Du legst eine Date an: random.houerly.csv Inhalt:

    15;88
    
    wenn die Zufallszahl gebraucht wird:  
       Datei einlesen: file_get_contents('random.houerly.csv')  
       Inhalt zerlegen: listen($stunde, $zahl)=explode(';', $string)
       wenn intval($stunde) == intval(date('h'):
          return $rand
       sonst:
          Zufallstahl errmitteln: $rand = random (...)
          Dateiinhalt bauen: $string="$stunde:$rand"
          Datei schreiben: file_put_contents('random.houerly.csv', $string)
          return $rand
    ende
    

    Jörg Reinholz

    1. Aloha ;)

      Nur kurz kleine Anmerkung zu eingeschlichenen Dreckfuhlern:

      Du legst eine Date an: random.houerly.csv Inhalt:

      Vllt. sinnvoller hourly statt houerly :P Ist aber ja im Endeffekt wurscht.

      15;88
      
      wenn die Zufallszahl gebraucht wird:  
         Datei einlesen: file_get_contents('random.houerly.csv')  
         Inhalt zerlegen: listen($stunde, $zahl)=explode(';', $string)
      

      Hier muss wohl eher stehen: list($stunde,$rand) = ...

         wenn intval($stunde) == intval(date('h'):
      

      Und hier kaufe ich noch ein )

            return $rand
         sonst:
            Zufallstahl errmitteln: $rand = random (...)
            Dateiinhalt bauen: $string="$stunde:$rand"
      

      Und hier muss natürlich (nachdem die Zufallszahl ermittelt wurde :P) statt einem : ein ; verwendet werden. Konkreterweise kann man hier auch sagen $string = intval(date('h')).';'.$rand

            Datei schreiben: file_put_contents('random.houerly.csv', $string)
            return $rand
      ende
      

      Grüße,

      RIDER

      P.S.: Bitte nicht falsch verstehen, ich will nicht unnötig rumkritteln, nur verwirrten Nachfragen vorbeugen. Außerdem hab ich auch was dazugelernt, list kannte ich nämlich vorher nicht.

      --
      Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
    2. Tach!

      Du legst eine Date an: random.houerly.csv Inhalt:

      Viele Wege führen nach Rom. Alternativ kann man auch einen Datenbank-Eintrag nehmen, besonders dann, wenn man sowieso schon seine Daten in einer Datenbank verwaltet.

      Der OP hat seinen Anwendungsfall nicht genau genug beschrieben. Daraus geht nicht hervor, ob die Zufallszahl für alle Anwender gleichermaßen gelten soll, oder jeder Besucher seine eigene Zufallszahl bekommt. Im zweiten Fall kann man eine Session nehmen - im ersten Fall auch. Dazu gleich mehr.

      Der Lösungsansatz mit der Datei hat den Nachteil, dass man ein beschreibbares Verzeichnis vorliegen haben oder erstellen muss. Das ist nicht unbedingt erstrebenswert, besonders dann nicht, wenn dieses Verzeichnis über das Web erreichbar ist und durch andere Sicherheitslücken beliebig ausführbare Dateien hochgeladen werden können. Abseits des DocumentRoot wäre ein besserer Ort.

      Eine Datei in einem Multi-User-System zu verwenden, kann zu einem TOCTTOU-Problem (Time-of-Check-to-Time-of-Use-Problem) führen. Ein zweiter Prozess überschreibt das Ergebnis des ersten Prozesses, wenn dem zweiten nicht bewusst ist, dass da grad ein anderer Prozess am Werkeln ist. Das kann sich zu einem Fehler auswirken, der schwer zu greifen ist, weil er nur durch ganz bestimmte, schwer nachzustellende Voraussetzungen auftritt. Es kann auch sein, dass er nie auftritt oder seine Auswirkungen unentdeckt bleiben und auch keinen Schaden anrichten. Wenn man es jedenfalls richtig machen möchte, muss man sich um das Locking von Dateien kümmern.

      Eine Datenbank kümmert sich auf Dateiebene selbst um den problemlosen parallelen Zugriff. Aber auch da hat man das TOCTTOU-Problem, wenn man keine Transaction einsetzt sowie Lesen und Schreiben in zwei getrennten Vorgängen stattfindet.

      Und nun zur Session. Da kümmert sich PHP um problemlosen parallelen Zugriff. Eine Session ist üblicherweise user-individuell, aber man kann die Session-ID auch fest vorgeben. Dann kommt sozusagen jeder Besucher mit derselben SID und alle bekommen dieselbe Zahl. Die Vorteile gegenüber der Datei-Lösung sind, dass das Handling deutlich einfacher wird, besonders wenn man ansonsten eine vollständige Lösung mit Datei-Locking implementieren würde.

      Zu Beachten ist, dass man durch entsprechende Konfiguration das Session-Daten-Verzeichnis (session.save_path) möglichst separat von denen von anderen Anwendungen hält, sowie die Lebenszeit mindestens eine Stunde beträgt. Anderenfalls wird die Session-Datei zu früh weggeräumt. Das gilt übrigens gleichermaßen für benutzerindividuelle und globale Sessions.

      Eine weitere Möglichkeit wäre ein Cookie, aber das nur wenn der Anwendungsfall nutzerindividuell ist, und es auch nicht stört, wenn der Nutzer Cookies ablehnt.

      dedlfix.

  3. Ich erstelle mir mittels mt_rand(0, 100) eine Zufallszahl innerhalb eines bestimmten Bereiches. Nun möchte ich aber gerne das diese zufallszahl nicht jedesmal neu erstellt wird, sondern nur jede Stunde. Geht das irgendwie?

    Überlegungen: Nicht jedesmal neu erstellen heißt Zahl (zwischen)speichern. Jede Stunde neu heißt Gültigkeitsdauer (expires) festlegen. Wo wir diese beiden Werte speichen und für wen (Session?) sind weitere Überlegungen....

  4. Hi,

    Ich erstelle mir mittels mt_rand(0, 100) eine Zufallszahl innerhalb eines bestimmten Bereiches. Nun möchte ich aber gerne das diese zufallszahl nicht jedesmal neu erstellt wird, sondern nur jede Stunde. Geht das irgendwie?

    Eine weitere Möglichkeit: cronjob anlegen, der jede Stunde eine Datei mit dem neuen Wert überschreibt.

    In dem Script, das die Zahl benötigt, wird dann diese Datei gelesen.

    cu,
    Andreas a/k/a MudGuard