2013-03-04 248 views
1

我必須編寫oracle程序在registered_security_numbers中註冊16位安全號。 我知道安全號碼的前6位數字是或,其餘10位是隨機產生的。在oracle中生成16位數的隨機數

我有2個可能的解決方案:

  1. 寫第二個過程,它產生的所有可能的安全號碼,將它們插入possible_security_numbers表,設置屬性free=1。 然後當我收到一個請求註冊一個新的安全號碼時,我查詢possible_security_numbers表的隨機安全號碼,這是免費的,並將其插入registered_security_numbers

  2. 每次我提出請求來註冊安全號碼,我生成1234 1100 0000 0000隨機數 - 1234 1299 9999 9999範圍,直到我安全號碼,這不registered_security_numbers表存在,並且將其插入registered_security_numbers

(1)的方法,我不喜歡,因爲possible_security_numbers表將包含數十億條目,我不知道它有多好或有多快選擇/更新可以運行。

(2)方法我不喜歡,因爲如果我在registered_security_numbers表中有很多記錄,從一個範圍產生隨機數可能會重複多次。

我想知道如果任何人有其他的解決方案或解決方案我,這似乎對我不好可以發表評論......

+0

如果使用的ID會很稀疏,我不會預先生成。爲什麼它必須是隨機的?你可以選擇一個隨機數,如果不可用,然後找到第一個可用的id大於或等於(或其他類似的算法)? – Glenn 2013-03-04 21:59:00

回答

2

多少個數字,你究竟要產生?

想象一下,您最多可以生成100萬(10^6)個數字。如果是這樣,你將需要產生第二個隨機數的機率大約是10^-5(0.00005或0.005%)中的5。如果是這樣的話,擔心偶爾產生第二個數字或幾乎不可能產生第三個數字是沒有意義的。第二種方法將更有效率。

另一方面,想象你打算隨着時間的推移產生10億個數字。如果是這樣,那麼到最後,你需要產生第二個數字的可能性是5%,你需要經常合理地生成3或4個數字。在這裏,取捨要難得多。根據業務情況的不同,捕獲唯一違反約束的異常以及在某些調用上生成多個數字會對性能造成影響,這可能會導致服務違反SLA時間往往足以影響到效率,而枚舉有效數字的平均效率可能更高。

第三方面,想象你打算隨着時間的推移產生所有200億個數字。如果是這樣,到最後,你會發現在發現剩下的有效數字之前,必須生成100億個隨機數字。如果是這樣的話,那麼清楚的優勢將是首先列舉所有可能的數字並跟蹤哪些數字已被使用。