Fonction PHP : nombre_alea()

Ici, vous pouvez voir (et copier/coller) le code complet de la fonction PHP nombre_alea(). N'hésitez pas voter pour cette fonction si elle vous plaît ou si vous vouv en servez !

nombre_alea() ajouté le 2009-07-07 01:35:07 par Florent

function nombre_alea(){
	$nombre_chiffre = 6; 
		for ($i=0, $nombre =""; $i < $nombre_chiffre; $i++)
				$nombre .= mt_rand(0, 9);
	echo $nombre;
}

Voter pour cette fonction


Cette fonction permet de générer un nombre aléatoire. On peut définir nombre_chiffre selon l'utilité que l'on veut en faire. Ici j'ai mis 6 pour par exemple avoir un code anti-bot qui se génère. On pourrais faire plus simple, utiliser la fonction mt_rand() directement mais si on à 00876 alors on récupérera 876, donc pour un contrôle anti-bot ce n'est pas correct.

Commentaires sur la fonctions php

bat888 07/07/2009 à 08:46

mt_rand() suffi amplement combiné avec un str_pad() !

Adrian 09/07/2009 à 19:25

Et pourquoi ne pas utiliser les paramètres pour fixer $nombre_chiffre ? Pourquoi faire echo au lieu de return ?

Florent 09/07/2009 à 20:56

J'ai mis echo et non return car après il faut faire echo nombre_alea(); au lieu de nombre_alea();

Mais voila qui est modifié quand même ;)

function nombre_alea($nombre_chiffre){ 
		for ($i=0, $nombre =""; $i < $nombre_chiffre; $i++)
				$nombre .= mt_rand(0, 9);
	return $nombre;
}

Guile 11/07/2009 à 15:26

Bon, simple à lire et à comprendre.
Néanmoins, il y avait largement de quoi faire plus rapide.

Je propose donc nombre_alea2 qui, pour renvoyer une série de chiffre d'une longueur max de 9 digits est presque 4 fois plus rapide que la fonction proposée, et nombre_alea3 qui, pour renvoyer une série de chiffre d'une longueur de 10 digits ou plus est plus rapide que nombre_alea.

Certes, nombre_alea3 est moins aisée à lire et comprendre, mais pour une suite de 300 digits, nombre_alea fait 300 itérations simples, là où nombre_alea3 fait 30 itérations un peu complexes.

// Pour des nombres de 0 à 9 digits
function nombre_alea2($p_nbDigits) {
	return mt_rand(pow(10, $p_nbDigits - 1), pow(10, $p_nbDigits) - 1);
}

// Pour des nombres de plus de 9 digits
function nombre_alea3($p_nbDigits) {
	$result = '';
	$nb_to_generate = 0;

	do
	{
		$p_nbDigits		-=	$nb_to_generate;
		$nb_to_generate	=	min(9, $p_nbDigits);
		$result			.=	mt_rand(pow(10, $nb_to_generate - 1), pow(10, $nb_to_generate) - 1);
	}
	while ($p_nbDigits > 9);
	
	return $result;
}

Guile 11/07/2009 à 15:42

Allez zou, je continue mon petit truc avec nombre_alea4, qui permet de gagner encore des petits centièmes de millisecondes par-ci par-là. Elle utilise deux variables globales (globales car fait gagner 10% de performances par rapport à la même fonction contenant leurs déclarations), et permet ainsi d'être 20% plus rapide par rapport à nombre_alea3 et 60% plus rapide par rapport à nombre_alea, sur une série de 300 digits.

function nombre_alea4($p_nbDigits) {
	$nb_to_generate = 0;
	do
	{
		$p_nbDigits		-=	$nb_to_generate;
		$nb_to_generate	=	min(9, $p_nbDigits);
		$result			.=	mt_rand($tabMin[$nb_to_generate], $tabMax[$nb_to_generate]);
	}
	while ($p_nbDigits > 9);
	
	return $result;
}

guile 11/07/2009 à 15:43

Arf! J'avais oublié de mettre les 2 variables...
$tabMin = array(0, 0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000);
$tabMax = array(0, 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999);
function nombre_alea4($p_nbDigits) {
$nb_to_generate = 0;
do
{
$p_nbDigits -= $nb_to_generate;
$nb_to_generate = min(9, $p_nbDigits);
$result .= mt_rand($tabMin[$nb_to_generate], $tabMax[$nb_to_generate]);
}
while ($p_nbDigits > 9);

return $result;
}