2012-04-30 55 views
1

我正在實施一個系統,它需要在一定範圍內爲某人分配一個號碼,但不使用以前使用過的任何號碼。
請記住,數量範圍和排除列表都將相當大。x和y之間的隨機數,不包括數字範圍

起初,我以爲做這樣的事情,這將是最好的:

<?php 
    $start = 1; 
    $end = 199999; 
    $excluded = array(4,6,7,8,9,34); 
    $found = FALSE; 
    while (!$found) { 
    $rand = mt_rand($start,$end); 
    if (!in_array($rand,$excluded)) { 
     $found = TRUE; 
    } 
    } 
?> 

但我不認爲這是理想的,有是一個無限循環的可能性(或它採取了很長的時間/超時腳本)。

我也想過生成一個我需要的所有數字的數組,但肯定會有更大的數組?在2個巨型數組上做一個數組diff也肯定需要很長時間? 事情是這樣的:

<?php 
    $start = 1; 
    $end = 199999; 
    $allnums = range($start,$end); 
    $excluded = array(4,6,7,8,9,34); 
    $searcharray = array_diff($allnums,$excluded); 
    $rand = array_rand($searcharray); 
?> 

所以,我的問題是這將是一個更好的選擇?是否還有另一種(更好的)做法,以前曾有人使用過?

回答

2

數組持有大量數據會佔用大量內存,您是否可以不使用數據庫來保存這些數字?這通常是他們設計的。

+0

那就是我的想法。被排除的號碼在被分配後將在數據庫中。我想最初的範圍可能也是如此,但我將如何去使用它呢?每個數字用一個標記存儲一行,說明它是否被排除?考慮到它們已經連續存在,確實存儲所有數字將是浪費。 – Nick

+0

類似'SELECT ... WHERE number not IN(4,6,7,8,9,34)ORDER BY RAND()'? –

+0

您仍然可以執行'mt_rand'部分,但只需查看數據庫中生成的數字,而不是執行'in_array'。我會有一個只有1個字段的表格,它是數字 - 主鍵/介質。它不會那麼浪費,如果你有現場設置的權利,適當的數據庫已經針對這種東西進行了優化。 – fire

相關問題