Ein PHP-Array mit einem Seed randomisieren?
Ich bin auf der Suche nach einer Funktion, dass ich ein array übergeben und ein samenkorn in PHP und wieder eine "randomisierte" array. Wenn ich an das gleiche array und den gleichen seed wieder, ich würde erhalten die gleiche Ausgabe.
Habe ich versucht, diesen code
//Beispiel-array $test = array(1,2,3,4,5,6); //zeige das array print_r($test); //seed random number generator mt_srand('123'); //eine zufällige Zahl erzeugt basierend auf dieser echo mt_rand(); echo "\n"; //shuffle array shuffle($test); //zeige die Ergebnisse print_r($test);
Aber es scheint nicht zu funktionieren. Irgendwelche Gedanken auf, der beste Weg, dies zu tun?
Diese Frage Tänzen rund um das Thema, aber es ist alt und niemand hat eine tatsächliche Antwort, wie es zu tun: Kann ich zufällig ein array, indem Sie einen Samen und Holen Sie sich die gleiche Reihenfolge? - "ja" - aber wie?
Update
Die Antworten so weit mit PHP 5.1 und 5.3, aber nicht 5.2. Passiert einfach so, die Maschine, die ich ausführen möchten ist mit 5.2.
Kann mir jemand ein Beispiel geben, ohne mit mt_rand? Es ist "gebrochen" in php 5.2, weil es nicht die gleiche Folge von Zufallszahlen basiert aus den gleichen Samen. Finden Sie die php mt_rand Seite und die bug-tracker weitere Informationen zu diesem Thema.
InformationsquelleAutor der Frage cwd | 2011-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
array_multisort
, um die array-Werte mit einer zweiten Reihe vonmt_rand
Werte:Hier
$order
ist ein array vonmt_rand
- Werte von der gleichen Länge wie$arr
.array_multisort
sortiert die Werte der$order
und Aufträge, die Elemente von$arr
entsprechend der Reihenfolge der Werte von$order
.InformationsquelleAutor der Antwort Gumbo
Normalerweise sollte man nicht versuchen zu kommen mit Ihren eigenen algorithmen, um zufällige Dinge, da sind Sie sehr wahrscheinlich zu voreingenommen sein. Die Fisher-Yates Algorithmus bekannt ist, um sowohl eine effiziente und unparteiische aber:
Beispiel (PHP 5.5.9):
InformationsquelleAutor der Antwort André Laszlo
Das problem, das Sie haben, ist, dass PHP kommt mit zwei Zufallszahlen-Generatoren eingebaut.
Den
shuffle()
Befehl nicht dermt_rand()
random number generator; es benutzt die älterenrand()
random number generator.Deshalb, wenn Sie wollen
shuffle()
Verwendung eines seeded-Nummer, müssen Sie die Samen, die älter randomiser, mitsrand()
eher alsmt_srand()
.In den meisten anderen Fällen sollten Sie
mt_rand()
eher alsrand()
da es eine bessere random number generator.InformationsquelleAutor der Antwort Spudley
Die wichtigste Frage beinhaltet zwei Teile. Eines ist über, wie zu mischen. Der andere ist über das hinzufügen von Zufälligkeit.
Eine einfache Lösung
Dies ist wahrscheinlich die einfachste Antwort auf die wichtigste Frage. Es ist ausreichend für die meisten Fälle, die in PHP scripting. Aber nicht alle (siehe unten).
Obige Methode zu tun, auch wenn es nicht produzieren true random shuffle für alle möglichen seed-array-Kombinationen. Allerdings, wenn Sie wirklich wollen, dass es ausgewogen sein und alle, ich denke, PHP shuldn nicht Ihre Wahl sein.
Eine weitere nützliche Lösung für fortgeschrittene Programmierer
Wie gesagt von André Laszlo, Randomisierung ist ein schwieriges Geschäft. Es ist normalerweise am besten, lassen Sie ein dediziertes Objekt-handle. Mein Punkt ist,, dass Sie sollten nicht brauchen, um die Mühe mit der Zufälligkeit, wenn Sie schreiben, die shuffle-Funktion. Je nachdem, was Grad der ramdomness Sie möchten in Ihrem shuffle, haben Sie möglicherweise eine Reihe von Pseudo-Objekte zur Auswahl. So ist die oben könnte wie folgt Aussehen:
Nun, diese Lösung ist die, die ich wählen würden. Es trennt shuffle-codes von der Randomisierung codes. Je nachdem, welche Art von zufälligen, die Sie benötigen Sie können eine Unterklasse Pseudo-fügen Sie die benötigten Methoden und Ihre bevorzugte Formeln.
Und, wie die gleiche shuffle-Funktion kann verwendet werden, mit vielen Zufalls-algorithmen, random-Algorithmus kann an verschiedenen Orten verwendet werden.
InformationsquelleAutor der Antwort user1904991
In den letzten PHP Versionen, seeding der PHP-builtin
rand()
undmt_rand()
Funktionen wird nicht geben Ihnen die gleichen Ergebnisse jedes mal. Der Grund dafür ist mir nicht klar (warum würden Sie wollen, dass die Samen, die Funktion sowieso, wenn das Ergebnis jedes mal anders.) Trotzdem, wie es scheint, die einzige Lösung ist, um schreiben Sie Ihre eigene random-FunktionVerwendung:
Den obigen code wird die Ausgabe der folgenden Sequenz jedes mal Sie es ausführen:
Ändern Sie einfach die Samen zu bekommen eine ganz andere "zufällige" Reihenfolge
InformationsquelleAutor der Antwort Jules Colle
Einer Variante, die auch mit PHP version 7.2, da die php-Funktion create_function ist veraltet in der neuesten php-version.
InformationsquelleAutor der Antwort seinol
Dies scheint für mich am einfachsten...
InformationsquelleAutor der Antwort Martin Kopeček