[英]Get random number that does/doesn't match criteria (PHP)
使用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到99之間的數字(不包括9的精確倍數),我可以想到幾種避免尷尬循環的方法。 人們不喜歡在生成隨機數時循環,因為您可以永遠循環。 (但是,除非您是非常倒霉的人,否則這種情況當然不會發生-那種碰巧與意大利面西部片中的克林特·伊斯特伍德(Clint Eastwood)打架的人。)
您可能有一個查找表,可以將獲得的隨機數重新映射到所需的隨機數中。
隨機產生0-88。 將結果乘以9,再除以8,得到整數結果(底數,不是舍入)。 然后加1。
兩者都有可預測的時間安排。
do-while循環實際上有幫助的罕見情況之一
$testData = array( 7, 8, 9 );
do {
$rand = array_rand( $testData );
} while ( $testData[$rand] % 9 == 0 );
echo $testData[$rand];
對於有效結果數量較少的情況(例如,在您的示例中),一種替代方法可能是為多個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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.