Générer un nombre aléatoire avec pré-définis longueur PHP
Je suis en train de créer une fonction à l'aide de la fonction mt_rand() pour générer un véritable nombre aléatoire, depuis rand() n'est tout simplement pas suffisant.
Le problème est que j'ai besoin de pré-définir la longueur de la nombre, dire que j'ai besoin de 10 chiffres et de nombres aléatoires.
De toute façon, j'ai été déconner et c'est ce que je suis venu avec:
function randomNumber($length) {
$min = str_repeat(0, $length-1) . 1;
$max = str_repeat(9, $length);
return mt_rand($min, $max);
}
En théorie, cela devrait fonctionner (autant que je puisse dire), mais il ne le fait pas. La longueur est complètement aléatoire et il lance tout de même des valeurs négatives.
Des idées?
"dans le but de générer une véritable nombre aléatoire" eh Bien, vous aurez toujours obtenir un nombre pseudo-aléatoire. Même le Mersenne twister ne peut pas vous obtenir vraiment un nombre aléatoire. Le plus proche que vous pouvez obtenir est de random.org avec leur bruit atmosphérique de données.
Peu importe, ce n'est pas la question, la fonction mt_rand() est beaucoup plus aléatoire que rand().
rand(min,max) retourne un entier, alors que dans la gamme de PHP nombres entiers de 32 bits sur un système 32 bits.... rappelez-vous aussi que 0000000001 == 1, si votre portée est de 1 à 9999999999, vous voulez $min = 1 . str_repeat(0, $length-1)
Aussi, avec random.org je ne veux pas avoir à friser leur site web à chaque fois.
Je vais répéter: "rand(min,max) retourne un entier, alors que dans la gamme de PHP nombres entiers de 32 bits sur un système 32 bits"
Peu importe, ce n'est pas la question, la fonction mt_rand() est beaucoup plus aléatoire que rand().
rand(min,max) retourne un entier, alors que dans la gamme de PHP nombres entiers de 32 bits sur un système 32 bits.... rappelez-vous aussi que 0000000001 == 1, si votre portée est de 1 à 9999999999, vous voulez $min = 1 . str_repeat(0, $length-1)
Aussi, avec random.org je ne veux pas avoir à friser leur site web à chaque fois.
Je vais répéter: "rand(min,max) retourne un entier, alors que dans la gamme de PHP nombres entiers de 32 bits sur un système 32 bits"
OriginalL'auteur Karl | 2012-10-31
Vous devez vous connecter pour publier un commentaire.
Sauf si vous avez un de ces quantique-statique des bidules, vous ne pouvez pas vraiment un nombre aléatoire. Sur Unix, Os, cependant,
/dev/urandom
travaille pour "plus de hasard", si vous avez vraiment besoin de cela.De toute façon, si vous voulez un n-nombre de chiffre, c'est exactement ce que vous devriez obtenir: n chiffres individuels.
La raison de votre code existant n'est pas le travail, c'est parce que
0000...01
est encore1
àmt_rand
, et aussi quemt_rand
gamme n'est pas infinie. Les nombres négatifs sont des débordements d'entiers.Yep, désolé, j'ai fait une erreur.
mt_rand
est inclus. Il suffit de changer le10
à9
.Cela peut encore générer des nombres inférieurs à dix chiffres si le premier (deuxième, troisième...) est/sont à 0.
btw - je peux obtenir un nombre aléatoire sans quantique-statique truc - je n'ai qu'à observer la nature et les quantifier - nous sommes tous dans un état quantique de changement - par exemple, je peux capter la désintégration radioactive assez facilement avec un appareil photo numérique et un morceau de Americanum (à partir d'un détecteur de fumée). L'aléatoire n'est pas dur, c'est juste dur à l'intérieur de la machine.
Pas de zéros, et pour une fonction générique que vous pouvez passer à une longueur, il (a) ne suffit pas à sauver beaucoup et (b) ne fonctionne pas pour les 10 chiffres ou plus (secure.php.net/manual/en/function.mt-getrandmax.php).
OriginalL'auteur Ry-
Voici ce que j'utilise:
Une ligne, simple et sympathique! Le nombre ne sera jamais à 0, et permet à 0 en tout autre lieu.
OriginalL'auteur Jazzer
Court et doux:
Je suis en supposant que la légitime nombres, pas des chaînes de caractères comme 00010. Essayez utilisant la taille de votre numéro de:
Le seul qui ne fonctionne pas, c'est quand la longueur est de 1, un seul chiffre '0' ne sera pas possible de la valeur à renvoyer.
oui, j'ai frappé à soumettre avant que j'ai terminé le montage et l'exécution de codepad.org
la fonction mt_rand() ne prend pas en charge longueur arbitraire de nombres aléatoires.
Entendez-vous la solution proposée ne fonctionne pas dans certains cas? Je pense que ça va fonctionner parce que les $min et $max variables contiennent les nombres minimum et maximum de longueur $longueur respectivement. Donc, la fonction la fonction mt_rand() une seule longueur, comme option, pour sa sortie.
mt_rand()
n'a pas de sortie des nombres arbitraires. Elle est limitée pour ne pas créer des entiers supérieursmt_getrandmax()
, peu importe ce que les valeurs min et max que vous fournissez. Ce qui rend cette réponse échec pour la plupart des valeurs pour$length
vous pouvez fournir, sauf pour les valeurs comprises entre 1 et 7 ou 8. Voir mon commentaire à la question elle-même: stackoverflow.com/questions/13169025/....OriginalL'auteur Ray
OriginalL'auteur King Leon
L'utiliser pour les cordes d'une certaine longueur, avec à la fois des lettres et des chiffres. Testés.
OriginalL'auteur user3183399
Vous ne devriez pas commencer avec la longueur de limiter le nombres aléatoires. Plutôt accumuler une assez longue sortie, puis le couper à la bonne longueur:
Le rembourrage doit être là, parce que même les zéros sont générés au hasard et doit être conservé.
la fonction mt_rand() accepte deux valeurs entières. Il n'a pas vraiment d'importance si vous devez écrire le zéro en tant que "0" ou "00000", mais ce dernier est octal format de nombre!
OriginalL'auteur mario
vous avez votre concat 1 au mauvais endroit, votre gamme est-ce pour $longueur=2: {01,99} - parfois ses 01-09, qui est représentée comme 1-9 pas 01-09. Tout simplement à partir de 10: {10,99} sera à votre portée.
OriginalL'auteur Michael
Comment à ce sujet:
Garder la trace des numéros générés via la variable statique (qui est lancée une fois) permettra d'éviter de générer le même nombre deux fois, sauf si vous passez par l'ensemble de la gamme, dans ce cas, vous obtenez coincé dans une boucle infinie.
Par exemple:
OriginalL'auteur user5513314