Frage

Mit PHP (anderen Sprachen, mit gemeinsamen Einbauten sind willkommen), wie kann ich eine zufällige bekommen (oder pseudo-zufällig) Zahl, die nicht ein bestimmten Kriterien nicht entspricht?

IE: Ich möchte $x = rand(0, 99) aber nur, wenn ($x % 9) != 0.

Was ist eine saubere akzeptable Art und Weise wie die Zufallszahlen zu einem Kriterien zu beschränken?

Als Beispiel einer while() Schleife und möglicherweise breaking, wenn wir etwas haben, das unsere Kriterien erfüllt, dann die Zufallszahl nach der Schleife mit ?:

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

oder so etwas wie:

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

Oder gibt es eine prägnante oder geeignete Art und Weise dies zu erreichen?

War es hilfreich?

Lösung

Eines der seltenen Fälle, in denen eine do-while-Schleife tatsächlich hilft

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

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

echo $testData[$rand];

Andere Tipps

Ist das Ihr genauer Anwendungsfall, oder nur ein Beispiel?

Wenn Sie versuchen, (insbesondere) Zahlen erhalten 0-99 ohne genaues Vielfachen von 9, kann ich denke an ein paar Möglichkeiten, die peinliche Looping zu vermeiden. Leute mögen nicht Schleife, während Zufallszahlen zu erzeugen, da könnten Sie Schleife für immer. (Aber das ist natürlich nicht passieren wird, wenn Sie die äußerst unglückliche Art sind -. Die Art von Person, die sie in Schießereien mit Clint Eastwood in Spaghetti-Western erhascht)

  1. Sie können eine Lookup-Tabelle haben, dass Ordnet die Zufallszahlen Sie erhalten in die, die Sie wollen.

  2. generieren 0-88 zufällig. Multiplizieren des Ergebnisses mit 9 und teilen sie durch 8 und erhalten die ganzzahliges Ergebnis (Boden, nicht rund). Dann wurde 1 hinzuzufügen.

Beide haben vorhersagbaren Timing.

Ein alternatives Verfahren, der Raum für potenziell mehr PRNG Anrufe, für die Fälle mit einem kleinen Anzahl von gültigen Ergebnissen (wie in Ihrem Beispiel) handelt wäre einen Array mit den gültigen Lösungen zu füllen und den PRNG verwenden, um einen Index zu erzeugen, in das Array.

Welche Methode Sie wählen, auch ich würde vorschlagen, für die Produktion Code, in Anbetracht der Grund für die Einschränkung in einer geeigneten und zugänglichen Art und Weise.

Dies entspricht die 'prägnante Anforderung:

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

oder

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

Es ist jedoch nicht sehr gut lesbar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top