Mon rand() est plus gros que ton mt_rand() !

ViPHP
ViPHP | 4674 Messages

13 janv. 2009, 17:43

Hey :),

Je voulais éclaircir un point de la documentation avec vous.
Par défaut, PHP utilise le générateur de nombres aléatoires de libc avec la fonction rand(). mt_rand() est une fonction de remplacement, pour cette dernière. Elle utilise un générateur de nombres aléatoire de caractéristique connue, le " » Mersenne Twister " qui est 4 fois plus rapide que la fonction standard libc.
Comme je vais devoir tirer plusieurs milliers de nombres aléatoires, je me dis : chouette ! Mais avant, un test de précaution :
$b = new Hoa_Bench();

$b->rand->start();
for($i = 0; $i < 100000000; $i++) rand();
$b->rand->stop();

$b->mt_rand->start();
for($i = 0; $i < 100000000; $i++) mt_rand();
$b->mt_rand->stop();

echo $b;
Même pas peur, allons-y pour 100 millions de tirages.
Le résultat est le suivant :

Code : Tout sélectionner

rand ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 23804.974 ms, 92.585 % mt_rand |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 25711.369 ms, 100 %
J'ai refait plusieurs fois ce test et le résultat est toujours le même : rand() est plus rapide que mt_rand(). Alors, la documentation nous aurait menti ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 4674 Messages

13 janv. 2009, 18:03

J'ai remarqué que pour 10 ou 1000 tirages, mt_rand est effectivement plus rapide. Mais comme j'aurais des milliers de tirages, j'écarte ces exceptions.
Sinon, les résultats pour 10 tirages :

Code : Tout sélectionner

rand |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 0.036 ms, 100 % mt_rand ||||||||||||||||||||||||||||| 0.015 ms, 41.722 %
et pour 1000 tirages :

Code : Tout sélectionner

rand |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 0.362 ms, 100 % mt_rand |||||||||||||||||||||||||||||||||||||||||||||||||||| 0.271 ms, 74.786 %
Et 1 fois sur 10 lots, les résultats sont presque inversés …
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 3607 Messages

13 janv. 2009, 19:04

hop,
Peut-être que mt_rand() "traine" derrière lui quelques ressources non libérées ou autre...
M'enfin bon on est pas près de savoir pourquoi (qui veut se coltiner la source de ces fonctions? :D ), le principoil, c'est que tu sois fixé pour ton utilisation particulière...

Mais la seconde question à se poser (hors performance), c'est la qualité de la génération...?
Il me semble que mt_rand() était un peu plus mieux, mais je sais plus d'où je tiens ça...

Et au fait... on peu faire les curieux?
C'est pourquoi faire ? :langue:

ViPHP
ViPHP | 4674 Messages

13 janv. 2009, 19:15

Peut-être pour les ressources … hmm, non, ça ne tient pas debout. Je pense que c'est le système de génération qui utilise des éléments qui ne sont pas précis, il doit attendre quelques choses ou poursuivre les calculs (plus probable que d'attendre). C'est ma première piste …
Les sources ne sont pas compliquées, c'est du calcul aléatoire « classique ». L'algorithme Mersenne Twister est censé être plus rapide en effet.
Quant à l'utilisation, on n'aurait pas la même pour rand() que pour mt_rand(). Par exemple, en sécurité on évitera d'utiliser Mersenne Twister pour de la cryptographie ou cryptoanalyse.
Donc mieux ou pas, ça dépend du contexte.

Pour le curieux (;-)), j'aimerais générer des entiers pour des tests (voir générateur de tests). Au passage, comme j'aimerais générer des nombres flottants et que le générateur de congruence combinée linéaire (grosso modo tirage pseudo-aléatoire entre 0 et 1) n'est pas suffisant pour moi, j'aimerais le coupler à Mersenne Twister. Mais j'ai besoin de démontrer que le nombre obtenu après calcul est toujours (pseudo-)aléatoire, et ça, c'est pas simple :-k.
Mais bon, mon binôme y travaille ;-).
Sinon, j'en ai besoin aussi pour tirer des index, ou tirer des chaînes de caractères … Bref, y en a un paquet (quoi qu'on réfléchit à la génération aléatoire de structures d'ARN réalistes pour les chaînes de caractères, mais bon, c'est un autre sujet :D).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).