質問
PHP(他の言語、一般的なビルトインを使用することを歓迎します)を使用して、特定の条件に一致しない乱数(または擬似乱数)を取得するにはどうすればよいですか?
IE:($ x%9)!= 0
の場合にのみ $ x = rand(0、99)
が必要です。
そのような基準に乱数を制約するための明確に受け入れられる方法は何ですか?
例として、 while()
ループを使用し、基準を満たすものがある場合は break
を使用し、ループの後に乱数を使用しますか? :
while ( ($rand_key = array_rand($array_of_items)) && ($rand_key % 9 == 0) )
{
// Do nothing?
}
または次のようなもの:
while ( $rand_key = array_rand($array_of_items) )
{
if ( $rand_key % 9 == 0 ) {
break;
}
}
または、これを達成するためのより簡潔または適切な方法はありますか?
解決
do-whileループが実際に役立つまれなケースの1つ
$testData = array( 7, 8, 9 );
do {
$rand = array_rand( $testData );
} while ( $testData[$rand] % 9 == 0 );
echo $testData[$rand];
他のヒント
それはあなたの正確な使用例ですか、それとも単なる例ですか?
(特に)9の正確な倍数を除く0から99の数値を取得しようとしている場合、厄介なループを回避するいくつかの方法を考えることができます。あなたは永久にループする可能性があるので、乱数を生成しながらループするのは好きではありません。 (もちろん、あなたが非常に不運なタイプでない限り、それは起こりません。スパゲッティウエスタンでクリントイーストウッドと銃撃戦に出くわすような人です。)
-
ルックアップテーブルを作成して、 取得した乱数を再マッピングします 必要なものに。
-
0-88をランダムに生成します。結果に9を掛けます そして8で割って取得します 整数の結果(フロアではなく、ラウンド)。次に、1を追加します。
これらの両方に予測可能なタイミングがあります。
有効な結果の数が少ない場合(例のように)、潜在的に複数のPRNG呼び出しのためにスペースを交換する代替方法は、有効なソリューションを配列に入れ、PRNGを使用してインデックスを作成することです配列に。
どのような方法を選択したとしても、量産コードでは、適切かつアクセス可能な方法で制限の理由を指摘することをお勧めします。
これは「簡潔な」要件に一致します:
while( ($x = rand(0, 99)) % 9 == 0 );
echo $x;
または
while ( $array_of_items[$rand_key = array_rand($array_of_items)] % 9 == 0 );
echo $array_of_items[$rand_key];
ただし、あまり読みやすくありません。