Quelle est la fonction de mélange aléatoire de PHP?

est-ce que quelqu'un sait quel est le caractère aléatoire de PHP shuffle() fonction? Cela dépend-il du système d'exploitation? Utilise-t-il le propre semoir de PHP?

Est-il possible d'utiliser mt_rand() en tant que générateur?

17
demandé sur Sinan 2011-04-17 19:17:28

7 réponses

shuffle() fonction est basée sur le même générateur d' rand(), qui est le générateur de système basé sur algorithme de congruence linéaire. C'est un générateur rapide, mais avec plus ou moins d'aléatoire. Depuis PHP 4.2.0, le générateur aléatoire est semé automatiquement, mais vous pouvez utiliser srand() fonction pour le semer si vous voulez.

mtrand() est basé sur algorithme de Mersenne Twister, qui est l'un des meilleurs pseudo-aléatoire algorithmes disponibles. Mélanger une tableau utilisant ce générateur, vous auriez besoin d'écrire votre propre fonction de mélange. Vous pouvez regardez par exemple algorithme de Fisher-Yates. L'écriture de votre propre fonction shuffle donnera un meilleur aléatoire, mais sera plus lente que la fonction shuffle intégrée.

14
répondu Charles Brunet 2011-04-17 15:55:23

basé sur la réponse de Mirouf (merci beaucoup pour votre contribution)... Je l'ai peaufiné un peu pour éliminer le comptage redondant. J'ai aussi nommé les variables un peu différemment pour ma propre compréhension.

si vous voulez utiliser ceci exactement comme shuffle (), vous pouvez modifier le paramètre à passer par référence, i.e. & $ array, puis assurez-vous de changer le retour en simplement: "return;" et assignez le tableau aléatoire résultant à $array comme tel: $array = $ randArr; (Avant le retour).

function mt_shuffle($array) {
    $randArr = [];
    $arrLength = count($array);

    // while my array is not empty I select a random position
    while (count($array)) {
        //mt_rand returns a random number between two values
        $randPos = mt_rand(0, --$arrLength);
        $randArr[] = $array[$randPos];

        /* If number of remaining elements in the array is the same as the
         * random position, take out the item in that position,
         * else use the negative offset.
         * This will prevent array_splice removing the last item.
         */
        array_splice($array, $randPos, ($randPos == $arrLength ? 1 : $randPos - $arrLength));
    }

    return $randArr;
}
5
répondu KDallas 2016-10-29 06:22:49

C'est de l'aléatoire comme rand();

et en tant que style PHP vous n'avez pas besoin de semer

4
répondu dynamic 2011-04-17 15:18:59

mise à Jour de PHP 7.1

Depuis le rng_fixes rfc a été implémenté pour PHP 7.1, la mise en place de shuffle utilise maintenant le PRNG Mersenne Twister (i.e. il utilise mt_rand et est affecté par l'appel