Pourquoi Rand () génère-t-il un nombre faible?

Voici mon code

<?php function random_id() { $chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $id = ''; for ($i = 0; $i < 5; ++$i) { $id .= $chars[rand(1, 26)]; } echo $id; } random_id(); ?> 

Il continue de générer des ID avec 5 numbers minuscules, et TRES occasionnellement il en aura un numéro. J'ai également essayé avec mt_rand() et mt_rand() srand(time()) et srand(microtime()) au début du script avant la boucle.

Aussi, devrait-il être rand(1, 26) ou rand(0, 25) ?

Votre string a plus de 26 caractères. Utilisez plutôt cette fonction rand:

 rand(0, strlen($chars) - 1) 

Pour ne pas calculer la longueur de la string à chaque itération, mais toujours la maintenir dynamic, il vaut la peine d'envisager de déplacer le calcul en dehors de la boucle de la manière suivante:

 $chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $chars_cnt = strlen($chars) - 1; for ($i = 0; $i < 5; ++$i) { $id .= $chars[rand(1, $chars_cnt)]; } 

Vous ne générez pas un nombre random suffisamment élevé pour get l'set du tableau.

Caractères minuscules: 0-25

Numéros: 26-35

Voitures majuscules: 36-61

0 est le sharepoint départ et strlen($chars) est le nombre de caractères dans la string $str .

Vous devriez changer votre code à ceci:

  for ($i = 0; $i < 5; ++$i) { $id .= $chars[rand(0, strlen($chars)-1)]; } 

Je pense que vous devez vous souvenir d'utiliser un nombre plus grand que 26, car c'est le nombre de lettres dans l'alphabet, vous pouvez utiliser 26 + 26 + 10 = 62:

 $id .= $chars[rand(0, 61)]; 

À VOTRE SANTÉ!

Les arrays en PHP ne sont pas indexés, donc oui, le premier numéro dans l'appel doit être nul. Vous ne choisissez que le début du tableau.

Utilisez ceci en lieu et place:

 for ($i = 0; $i < 5; ++$i) { $id .= $chars[rand(0, 61]; } 

Votre $ chars contient une string de longueur> 26, mais votre nombre random est compris entre 1 et 26 (inclus). L'index de string commence par 0 qui est char a. Pour l'instant, seul les chars bcd … xyz1 sont utilisés. Vous pouvez vérifier dynamicment la longueur de la string et get un nombre random valide.

 function random_id() { $chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $chars_cnt = strlen($chars)-1; $id = ''; for ($i = 0; $i < 5; ++$i) { $id .= $chars[rand(0, $chars_cnt)]; } return $id; } echo random_id();