获取符合/不匹配条件的随机数(PHP)

时间:2009-06-24 16:19:53

标签: php random

使用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;
    }
}

或者是否有更简洁或恰当的方法来实现这一目标?

4 个答案:

答案 0 :(得分:4)

这是您的确切用例,还是仅仅是一个示例?

如果你正在尝试(特别是)从0到99之间的数字,不包括9的精确倍数,我可以想到几种方法来避免尴尬的循环。人们不喜欢在生成随机数时循环,因为你可以永远循环。 (但当然,除非你是一个非常不幸的类型,否则这种情况不会发生 - 那种碰巧与克林特·伊斯特伍德在意大利西部片中发生枪战的人。)

  1. 你可以有一个查找表 重新映射您获得的随机数 进入你想要的人。

  2. 随机生成0-88。将结果乘以9 然后除以8得到 整数结果(地板,不是圆形)。然后加1。

  3. 这两个都有可预测的时间。

答案 1 :(得分:3)

do-while循环实际上有助于

的罕见情况之一
$testData = array( 7, 8, 9 );

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

echo $testData[$rand];

答案 2 :(得分:1)

对于具有少量有效结果的情况(如在您的示例中),为可能的多个PRNG调用交换空间的替代方法是使用有效解决方案填充数组并使用PRNG生成索引进入阵列。

无论你选择哪种方法,我都建议,对于生产代码,以适当和可访问的方式注明限制的原因。

答案 3 :(得分:0)

符合“简明”要求:

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];     

然而,它不是非常易读。