使用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;
}
}
或者是否有更简洁或恰当的方法来实现这一目标?
答案 0 :(得分:4)
这是您的确切用例,还是仅仅是一个示例?
如果你正在尝试(特别是)从0到99之间的数字,不包括9的精确倍数,我可以想到几种方法来避免尴尬的循环。人们不喜欢在生成随机数时循环,因为你可以永远循环。 (但当然,除非你是一个非常不幸的类型,否则这种情况不会发生 - 那种碰巧与克林特·伊斯特伍德在意大利西部片中发生枪战的人。)
你可以有一个查找表 重新映射您获得的随机数 进入你想要的人。
随机生成0-88。将结果乘以9 然后除以8得到 整数结果(地板,不是圆形)。然后加1。
这两个都有可预测的时间。
答案 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];
然而,它不是非常易读。