Jen

生活不無聊之 序號產生備忘錄

最近在有個小需求條件是 8 碼的英文 + 數用,不重複,請產生出n組。

 

所以總共會有34個字元,如下:

 static char[] aryChar = { 
'a', '1' , '3', 'b', '6', 'c', '4', 'd', 'e', '7','f', 'g', 'h', 'i', 
'j', 'k',  'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
 'z', '2',  '5', '8', '9', '0'
                           };

 

所以會有 34^8 種組合,總共是1785793904896。好多啊!一開始我打算用Shuffling演算法來(撲克演算法),不過分母實在是太多了,光要產生這麼長的陣列就有點…

 

改個做法,因為只要不連續,我先產生n組不連續的數字,作為1785793904896種例舉的索引值,再由這個索引值對應aryChar,抓出該對應的序號。

 

那怎麼產生 n 組不連續且不重複的數字呢? 跑一個 n 次的迴圈,設定一個倍數(區間),就一定不連續,也不會重複。

 

講完了,但看得懂我想表達的才有鬼咧。

 

假設有a、b、c 三個要排成2位數,會有9種狀況,如下:

1:aa

2:ab

3:ac

4:ba

5:bb

6:bc

7:ca

8:cb

9:cc

 

我要取3組不連續的,我可以取1、3、5(這個就是index索引值),也就是aa、ac、bb(這個就是我們要的值),所以我的做法就是產生index,再由index去取出對應的排列,序號量一多,就會比較好控管。如下:

 

//要產生的位數
int intSerial = 8;
//儲存char的字陣列
int charAryLength = aryChar.Length;
//總共要幾個字串
int limit = 66001;
//指定index要從幾號開始生產
int startInt = 0;
//間隔8000個. (可以調整,如果你覺得等差成長太規律,可以寫個函式,讓index的成長不會那麼固定)
int period = 8000;
//產生要放66000個index的陣列
int[] aryPosi = new int[limit];
//開始產生index,然後放到AryPosi陣列, ex:0 , 8000, 16000, 24000 ……
for (int i = startInt; i < limit; i++)
{
    int posit = i * period;
    aryPosi[i] = posit;
    //開始依照產生的index,跑出對應的序號
    for (int i = 0; i < intSerial ; i++) 
    { 
        // (index / 字元陣列的長度^i ) % 字元陣列的長度.
        int currPosi = 
         (int)(posit / 
            (int)Math.Pow((double)  charAryLength, (double)i)) % 
            (int)charAryLength; 
        rStr = aryChar[currPosi] + rStr; 
    } 
    string stRS = reStr(rStr); 
    Console.WriteLine(stRS); 
}

 

在理論上只要把 int period = 8000; 區間改大一點或者是指向一個函式,就可以稍為亂一些,但是但是…用到int64,還是無法解決index過大無法表示的問題,這個需要再研究一下。

 

其實也不能說太多,這篇也只是個備忘錄,或許是一些參考。

 

蕃外偏:

Teyou寫的

1231231231231

 

0 意見: