2012-12-30 25 views
1

我的一個客戶想要爲他的項目使用一個唯一的代碼(長篇故事..),他問我一個解決方案。代碼將包含4個部分,其中第一個是發送物品的郵政編碼,第二個是供應商註冊號碼,第三個號碼是發送物品的年份,最後一部分是三個除法字母數字獨特的字符。非重複性隨機字母數字代碼

正如你所看到的,前三部分是靜態字段,對於同一個發件人在同一年內永遠不會改變。所以我們可以說最後一部分是那年的標識符部分。這部分是3分的alpahnumeric,意思是從000開始到ZZZ結束。

問題是,我的客戶,由於一些合理的原因,希望這部分不是順序的。例如,這不是他想要的東西:

06450-05-2012-000

06450-05-2012-001

06450-05-2012-002

.. 。

06450-05-2012-ZZY

06450-05-2012-ZZZ

最後一部分應該產生隨機似:

06450-05-2012-A17

06450-05-2012-0BF

06450-05-2012-002

...

06450-05-2012 -T7W

06450-05-2012-22C

但它也應該是不重複的。所以一旦產生了一個可能的id,就應該從選擇池中丟棄這個可能性。

我正在尋找一種有效的方法來做到這一點。

  1. 如果我只記錄選定的可能性並檢查一個新創建的對他們的可能性,總會有最壞的情況發生,特別是在接近尾聲的情況下。
  2. 如果我一次創建所有可能性並將它們記錄在表或文件中,則每次創建項目可能需要一段時間,因爲它會查找未選擇的記錄。順便說一句,26個字母+10個數字意味着46.656個可能的組合,並且有可能會添加第4個divison,這意味着1.679.616個可能的組合。

有沒有更有效的方法可以建議?我將使用C#編碼和MS SQL數據庫..

+1

它必須是真正的隨機或只是不增量? – empi

+0

這聽起來像一個家庭作業..你是什麼意思,由於合理的原因..?聽起來像請求/任務在本質上是不合理的.. – MethodMan

+0

你的意思是說隨機而不是重複的部分只是最後一個3個字符? – Alaa

回答

4

如果它不必是隨機的,你也許可以簡單地選擇一個固定的,而是「不可預知」加數是相對素26 + 10 == 36 == 2²·3²。這意味着,只需選擇既不能被2也不能被3整除的固定加數。

然後,每當您需要新的序列號時,請繼續將此固定號碼添加到您之前的序列號中。這當然要以模46656(或1679616)來完成。

數學保證你不會得到相同的數字兩次(在沒有更多的「空閒」數字之前)。作爲加數,你可以使用const int addend = 26075,因爲它的模數爲56

+0

如果問題是關於作業,這可能是預期的答案。它向老師表明,你知道如何使用完整的殘留系統來解決(據說)真正的問題。 –

+0

@ ft1那麼我會是一個很棒的學生。 –

+0

感謝您的回答,而我的客戶希望它是完全隨機的,這似乎不是一個合適的解決方案。但另一方面,這種解決方案會產生一種「隨機幻覺」,因此值得用於其他解決方案。 –

4

如果您希望爲每個zip供應商年元組創建遠遠少於36^3的條目,則應該爲最後一個字段選擇一個隨機值,然後檢查它是否存在,如果存在則重複。

即使創建可能條目的最大數量的一半,新條目的預期值仍然只有一個故障。假設你的數據庫是在整個標識符上編制索引的,這個價格並不算太高。這就是說,如果你希望只使用幾個可能的標識符,那麼你應該提前創建所有可能的記錄。這可能聽起來像是一個高成本,但是存儲未使用記錄的內存中的每個空間最終都會存儲真實記錄。

我期望第一種情況更可能,但如果沒有,或者如果還有其他一些組合,請添加一些評論以及更多信息,我會修改我的答案。

+0

感謝您的回答。確實有36^3個組合,發件人一年內發送的內容大約爲1500件。但是將來可能會發送多達36^3個項目,這是我現在無法預測的。因此,可能存在最糟糕的情況,即隨機生成的部分可能長時間重複。考慮一下發件人已經發送36^3 - 1項目並嘗試爲最後一個項目創建記錄的情況,理論上可能需要永久生成最後一個非重複的隨機3 alpahn數字部分。 –

4

我覺得選項取決於將要使用的代碼量:

  1. 如果您希望在一年內使用的大部分,那麼最好是預先生成。如果做得對,查找應該非常快。無論如何,你在數據庫中每年要有1.679.616個項目,所以你將不得不做這樣的事情。

    另一方面,您期望使用它們中的大多數是否好?如果突然出現比預期更多的項目,它可能會讓您無法使用代碼。

  2. 如果你期望只使用少量,那麼隨機+存在檢查可能是一種方法,但不清楚它應該是什麼數量纔是最好的(我確信它是可能的計算雖然)。

+0

感謝您的回答,我不得不重複我爲ceykooo的帖子所寫的評論:確實有36^3個組合,發件人一年內發送的項目大約爲1500件。但是將來可能會發送多達36^3個項目,這是我現在無法預測的。因此,可能存在最糟糕的情況,即隨機生成的部分可能長時間重複。考慮一下發件人已經發送36^3 - 1項目並嘗試爲最後一個項目創建記錄的情況,理論上可能需要永久生成最後一個非重複的隨機3 alpahn數字部分。 –