2010-12-12 12 views
4

範囲内の数字は1〜62です。 私はそれらを「暗号化」して、何らかの順序で生成されていると推測することはできません。番号の並べ替え

だから、それは例えば、

1-> 35 2-> 19 3-> 61 ...私は1~1のマッピングを有すること

、100一部のマッピングであるべきです%可逆性。


私はマッピングをハードコーディングすることができますが、私はそれと数学のソリューション、引数として数値を取り、範囲1-62で番号を生成し、重複が発生しない式のいくつかの種類を好むだろう。この式が存在する可能性はありますか?ただ、歴史、検証スクリプトのための


<? 
    $test = array(); 

    $val = 37; 
    for($i=0;$i<62;$i++) 
    { 
    if($test[($i*$val)%62]) 
    { 
     print("Collision: $i ".$test[($i*$val)%62]."<br/>"); 
    } 
    $test[($i*$val)%62] = $i; 
    print("$i => ".(($i*$val)%62)."<br/>"); 
    } 

?> 

アップデート:ここで

IDは、これらの答えのおかげで生成されます。

qpOLHk 
NMb84H 
aI740D 
x5urn0 
UsROKn 
hPeb7K 
EcByu7 
1zYVRu 
oWlieR 
LjIFBe 
8G52YB 
v3splY 
SqPMIl 
fNc95I 
Cazws5 
ZxWTPs 
mUjgcP 
JhGDzc 
6E30Wz 

Sweeeeeet :-)

答えて

3

番号1〜62を配列に入れ、配列をシャッフルすることができます(たとえば、Fisher-Yates shuffleを使用)。配列のインデックスは、そのセルの内容にマッピングされます(ただし、0でインデックス付けされた配列を使用する場合は、off-by-oneエラーに注意してください)。

乱数ジェネレータの特定のシードを決定的に使用するには。

編集:より少ない計算コスト(とも推測しやすい)マッピングは、いくつかの定数を乗算し、その結果のモジュロ62を計算することである。

result = (input * 37) % 62 

番号37は一例です。 coprimeから62までの任意の数値を使用できます。これは31から離れた奇数です。

+0

これは私が検討していたハードコーディングに向いています。静的なシードはしますが、あまりにも多くの処理があることを恐れています。私は何か簡単なものが必要です... – BarsMonster

+0

@BarsMonster:処理はどれくらい許可されていますか?このアルゴリズムのどの部分を高価すぎると見なしていますか? –

+0

これは、解釈された言語で毎秒10,000回実行されます。あなたのソリューションはおそらくパフォーマンスの点では合っていますが、実際にはoutput =(input + 35)%62のようなものがありますが、少しランダムです。 – BarsMonster

0

RSAを使用してください。実装が非常に簡単です(言語に依存します)。ここにはworked exampleがあります。

+1

残念ながら、いくつかの大きな数値を法とする数値は出力されています。>指定された範囲に重複することなく各値を他の値にどのようにマッピングするのか分かりません。 – BarsMonster

+0

@BarsMonster:そうです。私はあなたが1-62のアウトプットも必要としているのを見ていませんでした。 – Jacob

1

Mark Byersのコメントに沿っています。 x mod n(例えば、n = 62)の逆数を求める。

xを入力した整数を[1, n]とします。 extended Euclidean algorithmを使用してとなるようにytを見つけます。その後、y = x^{-1} mod n

関連する問題