Obtenir un nombre aléatoire qui correspond / ne correspond pas aux critères (PHP)

StackOverflow https://stackoverflow.com/questions/1039400

  •  22-07-2019
  •  | 
  •  

Question

En utilisant PHP (les autres langages, en utilisant des versions communes courantes sont les bienvenus), comment puis-je obtenir un nombre aléatoire (ou pseudo-aléatoire) qui ne correspond PAS à certains critères?

IE: je veux $ x = rand (0, 99) mais seulement si ($ x% 9)! = 0 .

Quel est un moyen propre et acceptable de contraindre des nombres aléatoires à un critère comme celui-ci?

Par exemple, en utilisant une boucle while () , et éventuellement en break lorsque nous avons quelque chose qui répond à nos critères, puis en utilisant le nombre aléatoire après la boucle? :

while ( ($rand_key = array_rand($array_of_items)) && ($rand_key % 9 == 0) ) 
{ 
    // Do nothing?
}

Ou quelque chose comme:

while ( $rand_key = array_rand($array_of_items) ) 
{ 
    if ( $rand_key % 9 == 0 ) {
        break;
    }
}

Ou existe-t-il un moyen plus concis ou plus approprié d'y parvenir?

Était-ce utile?

La solution

Un des rares cas où une boucle do-while aide réellement

$testData = array( 7, 8, 9 );

do {
  $rand = array_rand( $testData );
} while ( $testData[$rand] % 9 == 0 );

echo $testData[$rand];

Autres conseils

Est-ce votre cas d'utilisation exact ou juste un exemple?

Si vous essayez (en particulier) d’obtenir des nombres de 0 à 99 en excluant les multiples exacts de 9, je peux penser à plusieurs façons d’éviter les boucles fastidieuses. Les gens n'aiment pas faire des boucles en générant des nombres aléatoires, car vous pourriez les avoir pour toujours. (Mais bien sûr, cela ne se produira que si vous êtes du genre extrêmement malchanceux - le genre de personne qui s’obtient par hasard dans des fusillades avec Clint Eastwood dans des westerns spaghettis.)

  1. Vous pourriez avoir une table de recherche qui remappe les nombres aléatoires que vous obtenez dans ceux que vous voulez.

  2. Génère 0 à 88 de manière aléatoire. Multipliez le résultat par 9 et diviser par 8 et obtenir le résultat entier (sol, pas rond). Puis ajoutez 1.

Les deux ont un timing prévisible.

Une autre méthode, qui permet d'échanger de l'espace sur plusieurs appels PRNG, dans le cas où il existe un petit nombre de résultats valides (comme dans votre exemple) consiste à renseigner un tableau avec les solutions valides et à utiliser le fichier PRNG pour générer un index. dans le tableau.

Quelle que soit la méthode que vous choisissez, je suggérerais également, pour le code de production, de noter la raison de la restriction de manière appropriée et accessible.

Ceci correspond à l'exigence 'concise':

while( ($x = rand(0, 99)) % 9 == 0 );
echo $x;

ou

while ( $array_of_items[$rand_key = array_rand($array_of_items)] % 9 == 0 ); 
echo $array_of_items[$rand_key];     

Cependant, ce n'est pas très lisible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top