2017-08-16 44 views
0

我想在數字和字母相同的格式生成字符串的序列位置算法以生成特定格式的唯一的字符串

e.g ABC12,DEV45,UED23,... 

它也需要一個公式來從下一個字符串目前的一個。例如從上面的字符串:

f(ABC12)=DEV45 
f(DEV45)=UED23 

我想用它來以定義的格式生成下一個「look-random」唯一代碼。你建議什麼算法?非常感謝。

+0

是什麼的問題,唯一的意思嗎? –

+0

@Everyveryx您正在使用哪種語言? – m69

回答

0

其中一種方法是預先計算數組形式的字母部分,然後將其與連續數字組合。對於字母數組:

  1. AAA, AAB, AAC, ..., ABA, ABB, ..., ZZZ開頭(總共17576個元素) - 所有可能的獨特組合;
  2. 洗牌數組 - 現在他們在(a)隨機和(b)預測順序;
  3. 從任何給定值 - >使用數組中的下一個元素。

對於位部分,用簡單的計數:

  1. 開始與00;
  2. 從任何給定值 - >增加1;
  3. 如果結果是100,請使用下一個字母部分 - 因此每個字符串都是唯一的。

這提供了1757600個獨特的字符串,如ABC12

+0

謝謝。雖然我想讓下一個元素看起來是隨機的,而不是前一個字符串的增量。我也不想使用預生成字符串的數據庫。只需輸入當前字符串的公式,並輸出下一個字符串。 – Elveryx

3

格式「ABC12」的代碼基本上是一個5位數的數字,其中前3位是基數爲26,最後2位是小數。有26 10或1,757,600這些。每個代碼被容易地轉化爲相應的數字和背面:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 
ABC12 = (((0 * 26 + 1) * 26 + 2) * 10 + 1) * 10 + 2 =  2,812 
DEV45 = (((3 * 26 + 4) * 26 + 21) * 10 + 4) * 10 + 5 = 215,345 
UED23 = (((20 * 26 + 4) * 26 + 3) * 10 + 2) * 10 + 3 = 1,362,723 
2,812/10 =  281 rem: 2 
     281/10 =  28 rem: 1 
     28/26 =  1 rem: 2 
     1/26 =  0 rem: 1 
     0/26 =  0 rem: 0 -> 0 1 2 1 2 -> ABC12 

    215,345/10 = 21,534 rem: 5 
    21,534/10 = 2,153 rem: 4 
    2,153/26 =  82 rem: 21 
     82/26 =  3 rem: 4 
     3/26 =  0 rem: 3 -> 3 4 21 4 5 -> DEV45 

1,362,723/10 = 136,272 rem: 3 
    136,272/10 = 13,627 rem: 2 
    13,627/26 =  524 rem: 3 
     524/26 =  20 rem: 4 
     20/26 =  0 rem: 20 -> 20 4 3 2 3 -> UED23 

要遍歷從0號到1757599以僞隨機的方式中,選擇的步長,其僅返回到零在已行進穿過每一個號碼都沒了,然後計算下一個值:

x -> (x + step) % 1,757,600 

所以第一步應該有1757600沒有共同的因素:

1,757,600 = 2 * 2 * 2 * 2 * 2 * 5 * 5 * 13 * 13 * 13 

並且優選地大於26 * 26 * 10 * 10,使得每個數字隨着每個步驟而改變;所以,例如:

step = 3^11 = 177,147 

其給出該序列:

2,812          ABC12 
( 2,812 + 177,147) % 1,757,600 = 179,959 -> CRF59 
(179,959 + 177,147) % 1,757,600 = 357,106 -> FHJ06 
               ... 

這裏的一個代碼爲例來說明方法。這是因爲JavaScript有點煩人。在C語言中,字符串基本上是一個整數數組,代碼將更直接。

function nextCode(current) { 
 
    var base = [26,26,26,10,10], symbol = [65,65,65,48,48], char = [], number = 0; 
 
    for (var i = 0; i < 5; i++) { 
 
     var digit = current.charCodeAt(i) - symbol[i]; 
 
     number = number * base[i] + digit; 
 
    } 
 
    number = (number + 177147) % 1757600; 
 
    for (var i = 4; i >= 0; i--) { 
 
     var remainder = number % base[i]; 
 
     number = (number - remainder)/base[i]; 
 
     char[i] = String.fromCharCode(symbol[i] + remainder); 
 
    } 
 
    return char.join(''); 
 
} 
 
document.write("ABC12 &rarr; " + nextCode("ABC12"));

+0

+1你可能會提到這個相同的原理可以用乘法步進(加上一些機制在週期中包含AAA00),或者可能通過某種完美的散列函數或具有足夠週期長度的僞隨機數發生器。 – Patrick87