2009-06-24 47 views
0

使用PHP(其他語言,歡迎使用常見的內置函數),如何獲得不符合條件的隨機(或僞隨機)數字某些標準?獲取不符合條件的隨機數

IE:我想$x = rand(0, 99)但只有($x % 9) != 0

什麼是乾淨的可接受的方式來約束隨機數的標準呢?

舉個例子,使用while()循環,並可能break ING當我們有一些符合我們的標準,然後使用循環?:

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

請注意,你的第二個例子應該打破!=而不是== – schnaader 2009-06-24 16:27:34

回答

3

一個罕見的情況下,一個do-while循環實際上有助於

$testData = array(7, 8, 9); 

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

echo $testData[$rand]; 
+0

+1 - 一個do-while對於這種情況非常理想。 (嘗試,檢查,再次嘗試失敗。) – 2009-06-24 16:34:12

4

這是您的確切用例還是僅僅是一個例子?

如果您正在嘗試(特別是)從0到99的數字(不包括9的精確倍數),我可以考慮一些方法來避免尷尬的循環。人們不喜歡在產生隨機數的時候循環,因爲你可以永遠循環。 (當然,除非你是非常不吉利類型,這不會發生的 - 何許人誰碰巧讓自己與克林特·伊斯特伍德在槍戰通心麪條西部片)

  1. 你可以有一個查詢表 重新映射你得到 到你想要的隨機數。

  2. 隨機產生0-88。將結果乘以9 並將結果除以8得到整數結果 (floor,不是圓的)。然後加1。

這兩個都有可預測的時間。

+0

if($ rand%9 == 0)$ rand ++; // :-) – 2009-06-25 13:26:18

+0

@ Csaba - 我已經做了幾次。但它只適用於你不關心數字分佈的情況。 – Nosredna 2009-06-25 15:12:12

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

然而,不太可讀。

1

對於有少量有效結果的案例(如您的示例),可能會爲多個PRNG調用交換空間的另一種方法是使用有效解決方案填充數組,並使用PRNG生成一個索引到數組中。

無論您選擇什麼方法,我還建議,對於生產代碼,請以適當和可訪問的方式指出限制原因。