3

上記のすべての基準に適合するアルゴリズムを知っている人はいますか?シード番号と、出力番号を含める範囲(入力番号が含まれる範囲にもなります)を指定する必要があります。この関数には、操作を逆にする対応する関数も必要です。

例えば:

シード5と範囲5〜35を渡すと、番号27を受け取ります。次に、同じ範囲を使用して操作を逆にする関数にこれを渡すと、番号5が返されます。

元の番号を保存することも、入力された番号のリストを反復処理することもできません。これは暗号化の強度である必要はなく、可能な限り高速である必要があります。

この種の説明に当てはまると私が考えることができるのは、暗号化アルゴリズムだけです。正しい方向のポイントでさえ素晴らしいでしょう。

編集

大きすぎてメモリに保持できないランダムな(見た目の)数値のセット(おそらく3e12の数値)を表す方法を見つけて、特定の範囲の数値がそのセットに表示されるかどうかをテストしようとしています。

例えば。ランダムな集合(4、22、7、343、67、38、2)を与える関数がある場合、その集合の1から30までの数値を教えてください。セット(4、22、7、2)を取り戻します。

4

2 に答える 2

1

RBが言ったように、RNGではなく暗号化が必要です。特定のキーを使用すると、暗号化を元に戻すことができます。範囲を変更した同じシードから異なる結果が必要な場合は、キーにシードと範囲を組み込むこともできます。

範囲サイズは別の問題です。32ビット範囲の場合はDESを使用します。64ビットの場合はAESを使用します。他の範囲については、独自の単純なFeistel暗号を作成するか、すべてのサイズで定義されているHastyPudding暗号を使用してください。

使用する基本的なサイファーが何であれ、適切な範囲の数値を見つけるために、いつでもHasty Puddingメソッドを使用できます。必要な範囲内になるまで、出力を暗号化してください。適切なサイズのものができたら、下限を追加して必要な数を取得できます。したがって、5〜35の範囲では、[0..30]に数値を生成し、5を追加します。

ETA:問題についてもう少し考えてみると、シードをキーの一部として使用することはできません。そうした場合、乱数を復号化するためのキーを再構築することはできません。プロセスを逆にし始めたときにわかるキーのデータのみを使用できます。

また、シードに到達したときにシードを認識する方法も必要になります。復号化すると、一連の番号が表示されます。どれが元のシードであったかを選択する方法が必要です。おそらく、シードを指定された範囲(またはそのゼロベースの同等物)内に制限し、正しい範囲内にある復号化シリーズの最初のものを選択することができます。

于 2013-03-14T16:41:51.833 に答える
0

いいえ、これは不可能です。乱数ジェネレーターは、複数の異なるシードから同じ出力を生成できます(その点で、異なる入力から同じ出力を生成するハッシュアルゴリズムのようなものです)。

たとえば、PRNGは次のように機能します(疑似コード)。

PRNG randomWithSeed5 = new PRNG(seed: 5);
PRNG randomWithSeed6 = new PRNG(seed: 6);
PRNG randomWithSeed7 = new PRNG(seed: 7);

randomWithSeed5.NextInt(range: 5-50); //returns 20
randomWithSeed6.NextInt(range: 5-50); //returns 20
randomWithSeed7.NextInt(range: 5-50); //returns 32

この時点で、20の入力が与えられた場合に正しいシードを返すことができるデコードアルゴリズムを作成することは不可能であることは明らかです-あなたは正しい答えであるかどう5かを決定することができませんでした。6

暗号化アルゴリズムの方がニーズに合っているようです。乱数ジェネレーターが関係している理由すらわかりません。

于 2013-03-14T15:44:20.910 に答える