2017-08-16 3 views
0

私は数字と文字の同じ形式で文字列のシーケンスを生成したい特定の形式の一意の文字列を生成アルゴリズム

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

またから次の文字列を生成する式を必要なの位置に現在のもの。

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

これを使用して、定義された形式で次の「ルックランダム」一意のコードを生成したいと考えています。どんなアルゴリズムをお勧めしますか?どうもありがとう。

+0

? –

+0

@Elveryxあなたはどの言語を使用していますか? – m69

答えて

0

1つのアプローチは、文字の部分を配列形式で事前に計算し、それを連続する数字と組み合わせることです。文字列の場合:AAA, AAB, AAC, ..., ABA, ABB, ..., ZZZ(合計17576個の要素)と

  1. 開始 - すべての可能なユニークな組み合わせ。
  2. 配列をシャッフルする - 今は(a)ランダムかつ(b)予測順です。
  3. 任意の値から - >配列の次の要素を使用します。数字の部分については

は、簡単なカウントを使用します。

  1. 00でスタート。
  2. 任意の指定された値から - > 1だけ増分します。
  3. 結果が100の場合、次の文字部分を使用します。したがって、各文字列は一意です。

これは、ABC12のような1757600個のユニークな文字列を提供します。

+0

ありがとうございます。前の文字列のインクリメントではなく、次の要素をランダムに見せたいのですが。また、あらかじめ生成された文字列のデータベースを使用したくない場合もあります。現在の文字列を入力して次の文字列を出力する数式です。 – Elveryx

3

"ABC12"という形式のコードは基本的に5桁の数字で、最初の3桁はベース26で、最後の2桁は10進数です。 26 10または1,757,600があります。のみゼロに戻るステップサイズを選択し、擬似ランダムな方法で0から1757599の数をループし

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 

:各コードを容易に対応する数とバックに変換されます。

:だからステップは1757600と共通の要素を持たないはず

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

:すべての数を経て、その後、として次の値を計算した後

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