Je dois générer deux chiffres qui ne sont pas égaux en PHP. P>
Je sais que j'utilise merci! p> $ aléatoire1 = (rand ()% 9); code> pour générer un nombre aléatoire entre 0 et 9. Je dois ajouter quelque chose à cela, je suppose. P>
13 Réponses :
Si vous voulez simplement numéros uniques em>, il suffit de commencer à zéro et d'ajouter +1 pour chaque nouveau numéro. P>
Si vous avez besoin numéros uniques aléatoires em>, il suffit d'enregistrer vos numéros précédents dans une liste et lorsque vous en avez besoin d'un nouveau, générez des nombres aléatoires jusqu'à ce que vous trouviez un, ce qui est pas em> dans cette liste. p>
Si vous avez besoin identifiants uniques em>, vous pouvez utiliser la fonction intégrée Uniqid code>
. P>
$rnd1 = rand(0,9); do { $rnd2 = rand(0,9); } while ($rnd1 == $rnd2);
Théoriquement, cela pourrait boucle pour toujours si les chiffres étaient vraiment aléatoires. Peu probable dans la plupart des applications informatiques, mais la durée de fonctionnement est i> Nondéterministe, qui peut ne pas être souhaitable.
Heureusement, la plupart des générateurs aléatoires pratiques et non théoriques :). En retour, les deux randoms sont indépendants de l'autre (à l'exception de la contrainte d'origine).
@Fred, si vous souhaitez être sûr que ce code ne fonctionne pas pendant des années comme suggéré, vous pouvez configurer un compteur pour compter les tentatives, et après un seuil de retourner simplement ($ 1 + 1)% 10, ou autre.
Théoriquement, une météorite pourrait frapper la salle serveur à tout moment et détruire tout dans. En pratique, ce ne sera pas. Ne vous inquiétez pas des basses probabilités.
En fait, @drjokepu, nous planifions cette éventualité (pas nécessairement une météorite, mais certainement un lieu de serveur étant détruit). Nous avons un site de sauvegarde à 50 kilomètres impairs. Je me souviens d'un paranoïaque demandant ce que nous ferions si une catastrophe a pris des sites. Ma réponse était que, pour tout catastrophe que grand, nous aurions beaucoup plus de problèmes sur nos mains que de certaines données perdues.
Bien que l'impact du système soit effectivement minime, la performance soise ce n'est pas la meilleure méthode, d'autre part, la mine de mémoire sage n'est pas non plus. Je suppose que cela peut être résolu de manière multiple et qui est le mieux déterminé par la situation dont vous avez besoin pour l'utiliser.
@Chris, mais quelles garanties pouvez-vous donner sur la distribution ou la variance sur les deux variables aléatoires générées par votre méthode?
@Zed concernant ($ RND1 + 1)% 10: parce que vous n'avez pas de distribution même. Générez au hasard un numéro 0 - 9, ce qui signifie que chaque nombre a une chance de 1:10. Ensuite générer un 2e numéro. Si le nombre est identique à celui d'abord, utilisez le numéro suivant. Disons que le 1er numéro est 6. Si le 2e numéro est 6 ou 7, le 2ème numéro est vraiment 7. C'est une chance de 1: 5. Des chances très différentes que la solution dans votre poste d'origine, ce qui est en fait la meilleure réponse. Pourrait-il courir pour toujours? Oui. Un avion pourrait-il écraser dans votre maison pendant qu'il coure? Oui, et à un moment donné, vous jouez avec les mêmes chances.
$random1 = (rand() % 10) $random2 = ($random1 + (rand()%9)+1 ) %10
J'aime celui-là. Nice utilisation de module.
Cela moulait la distribution standard - les nombres inférieurs deviennent légèrement i> plus probables que les plus hauts, mais dans ce cas, il peut ne pas être perceptible.
@chris: Veuillez expliquer pourquoi les nombres inférieurs sont légèrement plus probables. Je ne peux pas voir pourquoi.
Interprétation de votre question plutôt lourdement Il semble que vous souhaitiez de générer pseudo-aléatoirement 2 entiers différents entre 0 et 9 inclus? P>
donc générer le premier, générer un autre, s'il est identique à la première répétition jusqu'à ce que ce ne soit pas. p>
J'affirme, sans justification, que cela sera aussi efficace que toute autre méthode. P>
$random1 = rand() % 9; $random2 = ($random1 + 1) % 9;
Le deuxième numéro ici sera complètement prévisible sur la base du premier nombre.
L'OP n'a indiqué que les chiffres ne doivent pas être égaux. Il n'a jamais dit que la seconde doit être aléatoire.
+1 Parce que, tandis qu'un peu cheeky, c'est exactement ce que l'OP a demandé. Bien que je suppose que $ aléatoire1 = rand ()% 9; $ aléatoire2 = $ rand1 ++; travaillerait aussi bien;)
$random1 = 4; $random2 = 5;
En fait, cela est assez drôle s'il est basé sur ce dessin animé trouvé ici: xkcd.com/221 . Si ce n'est pas basé sur cela, je suppose que c'est
C'est en fait inspiré par cette bande dessinée :-D
Je vous assure qu'il y avait des deux générées au hasard.
Je pense que vous verrez que Si vous voulez deux chiffres dans cette gamme, la meilleure façon est pour générer un dans cette plage puis générer un autre dans un de moins que cette plage et, si elle est identique ou plus, incrémenter. p> Ceci est la façon mathématique de le faire, et il est déterministe ( toujours em> deux appels à rand ()% 9 code> vous donnera un nombre compris entre 0 à 8 inclus. Si vous voulez 0 à 9 inclus, vous devez utiliser
rand ()% 10 code>. Je vais supposer que ce que vous vouliez, mais vous pouvez régler la réponse facilement si 0 à 8 était ce que vous vraiment em> prévu.
rand () code> peu importe). Bien que peu probable, un véritable générateur de nombres aléatoires pourrait produire une chaîne de nombres tous identiques ce qui rendrait les solutions looping peu judicieuses (vous êtes susceptible d'utiliser un générateur linéaire donc ce ne sera probablement pas un problème). P> Sur la première tentative, vous avez la gamme complète de choix (10 numéros, 0 à 9). Au deuxième, vous avez la gamme complète moins le nombre déjà choisi. Donc, si votre premier numéro était de 7, vous générez un nombre de 0 à 8 et la carte 7 à 8 et 8 à 9: p>
$random1 = (rand() % 10);
$random2 = (rand() % 9);
if $random2 >= $random1 {
$random2 = $random2 + 1;
}
Cela introduit beaucoup de dépendance entre les randoms. Si aléatoire1 est 5 par exemple, Random2 aura une possibilité plus élevée d'être 6 que tout autre nombre.
Je pense que si $ aléatoire2> = $ aléatoire1 donne de meilleurs changements, mais peut-être qu'il me manque un autre cas de bord.
Oui, tu as raison @kobi, c'est ce que je voulais dire, mais il est tard ici :-)
@Zed, c'était un artefact de mon ne pas l'écrire correctement. Les probabilités sont correctes si, comme @kobi souligne, vous utilisez les instructions correctes pour le mappage.
@Pax - cela devrait être $ aléatoire2> = $ aléatoire1 code>. La façon dont vous l'avez maintenant, les chances sont toujours fausses et les chiffres peuvent se retrouver égaux.
$r = str_shuffle("0123456789"); $r1 = (int) $r[0]; $r2 = (int) $r[1];
Wow, c'est en fait une solution vraiment soignée.
Bien que déterministe, cette solution est probablement plus lente que celle acceptée dans un cas moyen. De plus, cela ne permet pas de gérer les nombres à deux chiffres.
function random($min, $max) { $stack = range($min, $max); shuffle($stack); $nr1 = array_pop($stack); $nr2 = array_pop($stack); return array($nr1, $nr2); } This might do the trick without being a math wiz :)
Je suppose que shuffle code> est au moins linéaire, de sorte que cela ne fonctionne pas trop bien pour
max code>. Cependant, cela peut bien fonctionner si vous avez besoin de plus de 2 nombres aléatoires distincts.
... plus de 2 entiers aléatoires distincts.
$numbers = array_rand(range(0, 9), 2); echo '<pre>'; print_r($numbers); echo '</pre>';
La solution d'Alix Axel était la plus simple et a fonctionné bien pour moi. Je voulais trois entrées aléatoires d'un tableau existant, donc j'ai utilisé , puis affiché les entrées pour lesquelles la clé était dans $ rands p> p> p> p>
$random_numbers = array(); for ($i = 0; $i <= 1; $i++) { $random_numbers[$i] = rand(1,13); } I solved it by putting the rand inside an array inside a for loop. This way I got two different random numbers! The two numbers are placed in the array in two fields, random_numbers[0] and random_numbers[1]
Comment cela ne permet pas de copier des numéros? rand () code> pourrait toujours générer 6 dans les deux
aléatoire_numbers [0] code> et
aléatoire_numbers [1] code>.
$r = mt_rand(0, 9); $r2 = mt_rand(0, 9); $r2 = $r!==$r2 ? $r2 : (($r || $r === 9) ? $r-1 : $r+1);