2017-01-25 1 views
0

Ich muss eine Zufallszahl innerhalb eines bestimmten Bereichs generieren. Die Nummer muss für jeden neuen Monat des Jahres unterschiedlich sein, und es sollte nicht die gleiche sein (obwohl theoretisch möglich) wie die Zahl, die im Jahr zuvor für diesen bestimmten Monat generiert wurde.Zufallszahl generieren, die sich jeden Monat ändert

Ich dachte an die Verwendung der php rand($min, $max) Funktion in Verbindung mit date("w"), ich kämpfe mit dem Teil, wo ich verschiedene Ergebnisse für jedes Jahr bekommen muss.

Um zu zeigen, was ich meine, überprüfen Sie dies:

$numbers = range(1, 100); //our random array 
echo $numbers[date("w")]; //date("w") returns number of week 

Es gibt zwei Probleme hier: 1) ist es nicht wirklich zufällig ist, 2) die Nummer wird jedes Jahr das gleiche sein und 3) es nicht Reflektieren Sie die gesamte Größe des Arrays als Datum ("w") gibt eine Zahl zwischen 1 und 52 zurück.

Glauben Sie, dass dies in reinem PHP möglich ist? Oder muss ich dafür einen Cronjob machen?

Vielen Dank für jede Hilfe.

+1

Können Sie nicht einfach die zufällig generierte Nummer speichern und jeden Monat eine neue generieren? – freedev

+0

Ja, ich könnte das tun, aber ich frage mich, ob es einen Weg gibt, ohne es zu speichern. Vielleicht ist es ein wenig verrückt tho;) – Adrenaxus

+1

Einfach im Prinzip: hash den Wert von 'date ('Ym')'. Das gibt Ihnen einen zufälligen Wert für alle Absichten und Zwecke, der eindeutig mit dem aktuellen Monat verknüpft ist. Hashes erzeugen normalerweise einen hexadezimalen oder binären Wert, also müssen Sie sie nur in Dezimalzahlen umwandeln. Um es innerhalb eines bestimmten Bereichs einzuschränken, wenden Sie eine Operation wie Modul an. – deceze

Antwort

3

Sie könnten jeden Monat die gleiche Zahl im Seed verwenden. Nur um den Keim in der Funktion srand ([ int $seed ]) frei zu sein.

Sie können etwas tun:

srand(100); 
echo rand(); 

und jedes Mal, es gibt die gleiche Anzahl. So können Sie jeden Monat Folgendes tun:

$min = 1; 
$max = 100; 
date_default_timezone_set('UTC'); 
$seed = date('Ym'); // it is the date as an integer 
srand($seed); 
echo rand($min, $max); 

Achten Sie darauf, die Standardzeitzone festzulegen. Wenn dies nicht der Fall ist, hängt das Ergebnis von der Serverkonfiguration ab.

- UPDATE -

Wie @StevenSmith und @axiac angegeben Sie die zufällig generierte Nummer eindeutig ist nicht 100% sicher sind. Mit anderen Worten bedeutet dies, dass je größer die Bandbreite (Min-Max) ist desto höher ist die Wahrscheinlichkeit, dass Sie jedes Mal eine andere Zahl haben.

+0

Whoah, das ist ein paar schwere Sachen, interessante Lösung, wird das auch überprüfen! – Adrenaxus

+0

@freedev, Setzt der Samen auf diese Weise garantiert, um jeden Monat eine eindeutige Nummer zu geben? –

+0

@SteveSmith Nun, tut mir leid, nicht einzigartig. Zufällig. Das heißt, wenn die Reichweite groß genug ist, sind Sie fast sicher, dass jedes Mal eine andere Zahl zurückgegeben wird. Während ich die Antwort schrieb, erkannte ich den Unterschied. – freedev

1

Verwenden date('Ym') eine eindeutige Kennung für jede (Jahr, Monat) Kombination zu erzeugen, diesen Wert zu verwenden, die Pseudo-Zufallsgenerator des Motors initialisiert dann eine Zufallszahl generieren:

srand(date('Ym')); 
$value = rand(1, 100); 

die zweite Zeile einstellen entsprechen Deine Bedürfnisse. Jetzt wird eine ganze Zahl zwischen (und einschließlich) 1 und 100 generiert.

Der von date('Ym') zurückgegebene Wert ist während eines Monats identisch. Jedes Mal, wenn Sie srand() mit einem bestimmten Argument aufrufen, wird der Pseudozufallsgenerator mit diesem Wert neu initialisiert und erzeugt dann die gleiche Folge von Pseudozufallszahlen, wenn rand() (mehrmals) aufgerufen wird.

Dies gewährleistet die Generierung des gleichen Wertes für Sie während des gesamten Monats. Während des nächsten Monats und im selben Monat der folgenden Jahre wird der Pseudozufallszahlengenerator mit einem anderen Wert initialisiert und erzeugt eine andere Folge von Pseudozufallszahlen.

Abhängig von den Werten, die Sie in Ihrem Anruf an rand() verwenden, kann es vorkommen, dass der von diesem Monat zurückgegebene Wert in einem anderen Monat erneut zurückgegeben wird. Verwenden Sie einen großen Bereich für seine $min und $max Argumente, um diese Möglichkeit zu minimieren.

+0

Vielen Dank für Ihre Antwort. Ich mag die Lösungen von Ihnen und @ fredev. Will hineinschauen. – Adrenaxus

0

Sie könnten eine Zufallszahl generieren, das nächstliegende Vielfache von 12 auswählen und dann die aktuelle Monatszahl hinzufügen.

Wenn beispielsweise die Zufallszahl 616 ist, ist das nächste Vielfache von 12 612. Fügen Sie 0 hinzu (da es derzeit Januar ist), was eine endgültige Antwort von 612 ergibt. Dadurch wird sichergestellt, dass die Zahl für jeden Monat eindeutig ist.

+1

Sie müssen diese Nummer irgendwo speichern, sonst können Sie sie nicht den ganzen Monat wiederverwenden. Wenn Sie irgendwo Zahlen speichern wollen, gibt es einfachere Möglichkeiten, die Einzigartigkeit zu gewährleisten. – deceze