使用 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 的精确倍数),我可以想出几种方法来避免尴尬的循环。人们不喜欢在生成随机数时循环,因为你可能会永远循环。(当然,这种情况不会发生,除非你是那种极其不幸的人——那种碰巧在意大利西部片中与克林特·伊斯特伍德发生枪战的人。)

  1. 您可以拥有一个查找表,可以将您所获得的随机数重新删除到所需的数字中。

  2. 随机生成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];     

然而,这不是很可读。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top