Was ist der beste Weg, um ein Array, um in PHP randomisieren, ohne den shuffle () Funktion?

StackOverflow https://stackoverflow.com/questions/65970

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe diese Frage in einem Vorstellungsgespräch gefragt. Der Interviewer und ich nicht einverstanden, was die richtige Antwort war. Ich frage mich, ob jemand irgendwelche Daten auf diese hat.

Update:. Ich erwähnt habe, sollte, dass die Verwendung von shuffle () war streng verboten ... sorry

War es hilfreich?

Lösung

Sie können die Fisher-Yates mische .

Andere Tipps

shuffle($arr);

:)

edit: sollte ich klären ... meine Definition der besten beinhaltet auch nicht nur Effizienz, sondern Code Lesbarkeit und Wartbarkeit. Standardbibliothek Funktionen bedeutet weniger Code zu erhalten und zu viel weniger zu lesen. Darüber hinaus können Sie jahrelange Debatten mit PhD Professoren über den best „echten Zufall“ -Funktion erhalten in, so jemand mit Ihnen immer auf Randomisierung Fragen nicht zustimmen wird.

hier Nun, die Lösung, die ich kam mit:

function randomize_array_1($array_to_randomize) {
    $new_array = array();
    while (count($array_to_randomize) > 0) {
        $rand_num = rand(0, count($array_to_randomize)-1);
        $extracted = array_splice($array_to_randomize, $rand_num, 1);
        $new_array[] = $extracted[0];
    }
    return $new_array;
}

Und hier ist seine Lösung:

function randomize_array_2($array_to_randomize) {
    usort($array_to_randomize, "rand_sort");
    return $array_to_randomize;
}
function rand_sort($a, $b) {
    return rand(-1, 1);
}

lief ich ein paar Versuche auf beiden Methoden (versuchen jeweils 1.000.000 mal) und die Geschwindigkeitsdifferenz war vernachlässigbar. Doch bei der tatsächlichen Zufälligkeit der Ergebnisse überprüfen ich war überrascht, wie unterschiedlich die Verteilungen waren. Hier sind meine Ergebnisse:

randomize_array_1:
    [2, 3, 1] => 166855
    [2, 1, 3] => 166692
    [1, 2, 3] => 166690
    [3, 1, 2] => 166396
    [3, 2, 1] => 166629
    [1, 3, 2] => 166738

randomize_array_2:
    [1, 3, 2] => 147781
    [3, 1, 2] => 73972
    [3, 2, 1] => 445004
    [1, 2, 3] => 259406
    [2, 3, 1] => 49222
    [2, 1, 3] => 24615

Wie Sie sehen können, die erste Methode bietet eine nahezu perfekte Verteilung anzeigt, dass es zu sein mehr oder weniger wirklich zufällig, während das zweite Verfahren ganz über den Platz ist.

Der „richtige“ Weg ist ziemlich vage. Die beste (schnellste / einfachste / eleganteste), um ein Array zu sortieren wäre, nur die eingebaute in shuffle () Funktion zu verwenden.

Kurze Antwort: PHP array_rand() Funktion

Da die Verwendung der Shuffle-Funktion verboten ist, würde ich $keys = array_rand($myArray, count($myArray)) ein Array des Schlüssels von $myArray in zufälliger Reihenfolge zurückzukehren. Von dort sollte es einfach sein, sie in ein neues Array wieder zusammenzusetzen, die randomisiert wurde. So etwas wie:

$keys = array_rand($myArray, count($myArray));
$newArray = array();

foreach ($keys as $key) {
$newArray[$key] = $myArray[$key];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top