3

何年もの間、私はこれについて考えてきましたが、それを実装することができませんでした. 私は、入力で整数値 (たとえば 16 ビット) を受け入れ、出力で同じビットサイズのまったく異なる数を与えるが、すべての数値を「考慮に入れる」迅速で効率的な C 関数について話しています。実際のメモリを使用するのではなく、数学の魔法によって既に与えられています。申し訳ありませんが、英語は私の母国語ではありません。つまり、関数は 1 対 1 でランダムにマッピングする必要がありますが、重複はありません。

私が想像した可能なアプリケーションは、たとえば、画面上の古い写真をピクセルごとに新しい写真に置き換えるピクセルクロスフェードグラフィックルーチンの1つでした。座標はランダムに選択する必要があり、ピクセルが置き換えられると、再度アドレス指定しないでください (重複なし)。これはすべて、数学ベースの小さくて迅速かつ効率的な関数によって自然に行われます (メモリを使用してこれを実装するのは簡単ですが、それは私が望むものではありません)。

ランダムに見えないため、明らかに「ビットリバース」ソリューションは機能しません。たとえば、ビット 3 をビット 11 に交換するなどして、より多くの「カオス」を作成したり、一部のビットを反転させたりしても、見栄えがよくなかったので、純粋に数学的な、本当にランダムに見える関数を探していますおそらく少なくとも16ビットが可能で、できるだけ少ないメモリを使用します(事前に計算されたテーブルはありません。最終的に使用する最初のアプリケーションは、パブリックドメインのハードウェアとソフトウェアを使用して古いスタイルのゲームを作成するためのマイクロコントローラーシステムです) .

助けていただけますか?

4

4 に答える 4

3

探しているのは、基本的に、クロスフェードするピクセル数に対応するグループの循環ジェネレーターです。最も一般的なケースでは、これはグループのサイズに対する余素です。ピクセル数を法としてすべての計算を行うことで、実際にはランダムではなく、ランダム性の外観を得ることができます。

サイズ 32 のドメインがあり、5 のシードから開始するとします。常に 15 の余素を追加すると、次のシーケンスが得られます。

(5、20、3、18、1、16、31、14、29、12、27、10、25、8、23、4、...)

これはおそらく、要件に対して十分にランダムに見えるでしょう。

于 2012-08-02T10:05:36.443 に答える
1

さらに別のオプションは、暗号化を使用することです。暗号化は元に戻すことができるため、すべての暗号化は一意です。64 ビット数の場合は DES を使用します。16 ビットまたは 32 ビットの数値の場合は、Hasty Pudding Cipherを使用します。Hasty Pudding は、2 の累乗だけでなく、任意の範囲に適応させることもできます。

于 2012-08-02T12:27:33.937 に答える
0

あなたはハッシュ関数を必要としています。たとえば a=(a*31)%0xffff; を試してください。貧しい人のために。

于 2012-08-02T09:59:38.357 に答える
0

rand()関数はすでにこれを行っています。ただし、入力から数値を取得する代わりに、 によって初期化されsrand()、 への呼び出しごとに変更された格納された値を取得しrand()ます。

の実装を調べrand()て関数を取得するか、乱数生成についてさらに学習することができます。

ヒントは次のとおりです。

まず、剰余算術とは何かを理解してください。

次のシーケンスを想像してください。

m = 13
a = 7
b = 0

s = 5     s = (a*s + b) % m
s = 9     s = (a*s + b) % m
s = 11    s = (a*s + b) % m
s = 12    s = (a*s + b) % m
s = 6     s = (a*s + b) % m
s = 3     s = (a*s + b) % m
s = 8     s = (a*s + b) % m
s = 4     s = (a*s + b) % m
s = 2     s = (a*s + b) % m
s = 1     s = (a*s + b) % m
s = 7     s = (a*s + b) % m
s = 10    s = (a*s + b) % m
s = 5     s = (a*s + b) % m

この場合、b=0シーケンスをより簡単に見つけられるように設定したことに注意してください。それにもかかわらず、この例は本当に素晴らしいものではありませんが、要点は理解できます。と を適切に選択するabmランダムに見える数値を取得できます。

このように、関数が行う必要があるのは(a * argument + b) % m.

于 2012-08-02T10:00:13.973 に答える