Domanda

Usando PHP (sono benvenute le altre lingue, usando i built-in comuni), come posso ottenere un numero casuale (o pseudo-casuale) che NON soddisfa determinati criteri?

IE: Voglio $ x = rand (0, 99) ma solo se ($ x% 9)! = 0 .

Qual è un modo chiaro e accettabile per vincolare numeri casuali a un criterio del genere?

Ad esempio, usando un while () , e possibilmente break ing quando abbiamo qualcosa che soddisfa i nostri criteri, quindi usando il numero casuale dopo il loop? :

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

O qualcosa del genere:

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

O esiste un modo più conciso o appropriato per raggiungere questo obiettivo?

È stato utile?

Soluzione

Uno dei rari casi in cui un ciclo do-while aiuta davvero

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

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

echo $testData[$rand];

Altri suggerimenti

È il tuo caso d'uso esatto, o solo un esempio?

Se stai cercando (in particolare) di ottenere numeri da 0 a 99 esclusi i multipli esatti di 9, posso pensare a un paio di modi per evitare il looping imbarazzante. Alla gente non piace fare un ciclo mentre si generano numeri casuali perché potresti fare un ciclo per sempre. (Ma ovviamente ciò non accadrà a meno che tu non sia un tipo estremamente sfortunato - il tipo di persona che capita di trovarsi in scontri a fuoco con Clint Eastwood in spaghetti western.)

  1. Potresti avere una tabella di ricerca che rimappa i numeri casuali che ottieni in quelli che desideri.

  2. Genera 0-88 in modo casuale. Moltiplica il risultato per 9 e dividerlo per 8 e ottenere il risultato intero (piano, non rotondo). Quindi aggiungi 1.

Entrambi hanno tempistiche prevedibili.

Un metodo alternativo, che scambia spazio per, potenzialmente, più chiamate PRNG, per casi con un numero ridotto di risultati validi (come nell'esempio) sarebbe quello di popolare un array con le soluzioni valide e utilizzare il PRNG per produrre un indice nell'array.

Qualunque metodo tu scelga, suggerirei anche, per il codice di produzione, notando il motivo della restrizione in modo appropriato e accessibile.

Questo corrisponde al requisito "conciso":

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

o

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

Tuttavia, non è molto leggibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top