1

私は、バイトのセット(たとえば、10または15バイト)を取得して、そのバイトのリストを生成するシードのリストを返すことができるバイトのPRNGを構築しようとしています。私は暗号化について心配していませんが、それはほぼ均一に分散されている必要があり、可能なすべての2 ^ 8の組み合わせにヒットする必要があり、ときどき行き詰まることなく番号を繰り返すことができる必要があります。

問題は、私が読んだほとんどのアルゴリズムが暗号を使用していることです。これはおそらく繰り返しが許可されないことを意味するか、損失を引き起こして関数を逆にすることをせいぜい非現実的にするモジュラスまたは非循環シフトを使用します。また、アルゴリズムがカウントを使用した場合、バイトリスト入力は生成時に内部PRNGのカウンターが何であったかを認識しないため、逆方向に作業するのは困難です。

私が探しているのは、ケーキを食べて食べ過ぎの状況であることに気づきましたが、私が見逃していた別の解決策がないことを確認したかったのです。

検索中に、同様の要件を持つこの投稿に出くわしました。私はC#で書いていましたが、実際には構文は重要ではありません。

私が自分で作成しようとしたすべてのアルゴリズムは暗号であるため、繰り返しに失敗したり、分散が均一でなかったりします。インバージョン、サーキュラーシフト、シードマスキングを使用しました。

4

2 に答える 2

1

これは機能しますか?

#include <stdio.h>

int seed = 1;

int next() {
    seed = 1664525*seed + 1013904223;
    return (seed & 0xff) ^ (seed>>8 & 0xff) ^ (seed>>16 & 0xff) ^ (seed>>24 & 0xff);
}   

int main() {
    int i;
    for(i = 0; i < 1000; i++) {
        printf("%d\n", next());
    }   
}  

これは全周期の線形合同ジェネレーター (LCG) に基づいているため、最終的にはすべてのバイトがすべてのシードによって生成されます。リピートもあるようです。また、基礎となる LCG の統一性を継承しています。

于 2012-01-13T09:38:44.433 に答える
0

私のアドバイザーは、グループの HPC シミュレーションの取り組みをサポートするために、PRNG (L'Ecuyer の clcg4 に基づく) を可逆的に変更しました。これらについては、こちらで読むことができます。

基本的に、これは実行されたことを「元に戻す」ものであり、ご想像のとおり、これには乱数生成を「元に戻す」必要があり、別の計算パスに沿って同じ値を再生成する必要がある場合があります。このコードは、ここここで見ることができます。これは BSD ライセンスのコードです。

于 2013-01-21T23:04:02.737 に答える