题
使用 PHP(其他语言,欢迎使用常见的内置函数),如何获得不符合特定条件的随机(或伪随机)数字?
IE:我想 $x = rand(0, 99)
但前提是 ($x % 9) != 0
.
将随机数限制为这样的标准的干净可接受的方法是什么?
例如,使用 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循环实际上有助于
$testData = array( 7, 8, 9 );
do {
$rand = array_rand( $testData );
} while ( $testData[$rand] % 9 == 0 );
echo $testData[$rand];
其他提示
这是您的确切用例,还是只是一个示例?
如果您(特别是)尝试获取从 0 到 99 的数字(不包括 9 的精确倍数),我可以想出几种方法来避免尴尬的循环。人们不喜欢在生成随机数时循环,因为你可能会永远循环。(当然,这种情况不会发生,除非你是那种极其不幸的人——那种碰巧在意大利西部片中与克林特·伊斯特伍德发生枪战的人。)
您可以拥有一个查找表,可以将您所获得的随机数重新删除到所需的数字中。
随机生成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];
然而,这不是很可读。
不隶属于 StackOverflow