簡體   English   中英

獲取不符合/不符合條件的隨機數(PHP)

[英]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)打架的人。)

  1. 您可能有一個查找表,可以將獲得的隨機數重新映射到所需的隨機數中。

  2. 隨機產生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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM