Cプリプロセッサで一連の乱数を生成し、変数に格納してプログラムで使用したいと考えています。C/C++プリプロセッサで一連の乱数を生成する方法
目的:
私は私が私のプログラムをビルドするたびにランダムな数字の「ユニーク」セットを生成したいと思います。乱数を格納する変数の小さなサブセットは、意味のある(すなわち、非ランダムな)番号で上書きされる。意味のある数字と乱数を区別できるように、プログラムをデバッグしたり、複数のビルドを比較したりすることで、ハッカーにとって不可能であることを望みます。ビルドプロセスを自動化し、自立させたいと思います。実装をVisual StudioとGCCで移植可能にしたいと思います。
明確化:
- 計算がないプログラムの実行時に、コンパイル時に行われなければなりません。プログラムをデバッグする人は、変数が定数(乱数)に初期化されているかどうかだけを知ることができます。
- 乱数は整数でなければなりません。
- 乱数ジェネレータは、何らかの方法で
__DATE__
と__TIME__
からシードされる必要があります。そのため、異なるビルドで異なる乱数が生成されます。 - 乱数の範囲(例えば、1から100)を指定できることが望ましいことは絶対に必要ではありません。
- 生成する乱数の総数を指定できる(たとえば、1000個の変数を宣言し、それぞれを乱数に初期化する)ことが可能であることが望ましい場合がありますが、絶対に必要なわけではありません。 SO FAR
の試み:プリプロセッサでの算術上の
- 前のスレッド:Can the C preprocessor perform integer arithmetic? 持ち帰りの#if条件が算術演算を評価することができるということです。
- グーグルでは、演算以外に、#ifによってシフト演算とビット演算も評価できることがわかります。 Visual Studio C++でこれを確認しました。
単純乱数発生器の候補:http://www.ciphersbyritter.com/NEWS4/RANDC.HTM#[email protected] 乱数発生器のいずれか1つ、または乱数発生器からリバースエンジニアリングすることが不可能な任意の発生器は、特にうまく動作するジェネレータ。この演習のために、私たちは一例として、以下を使用することができます。
unsigned long jcong=380116160; #define CONG (jcong=69069*jcong+1234567)
私は基本的な問題が発生器への連続呼び出しの間、変数jcongに格納されている状態があることだと思います。変数の割り当ては、私が知る限り、プリプロセッサではサポートされていません。おそらくトリックを行うことができる巧妙な再帰的なマクロがありますか?
私が得ることができる最も近いが、プリプロセッサによって実行されているの私の目標を満たしていないが、次のとおりです。
unsigned long jcong=380116160; unsigned long randomBlock[] = {jcong=69069*jcong+1234567, jcong=69069*jcong+1234567};
私は、これは確かに異なるランダムに配列メンバを初期化しないことのVisual Studio C++で確認しています数字。ただし、デバッガはまだ初期化を実行します。
これは純粋なプログラミング/実装上の問題、プリプロセッサやハッカーとの戦いの無益の悪にそうしてください、ノー布教です。
本当にプリプロセッサかC++のtempが必要ですか遅いですか? –
プリプロセッサは必須ではありません。私は実行可能ファイルを通して "unhackable"にするだけで十分です。 – Dale
@Dale「私はそれだけで「解けない」ことが必要です」 - あなたには悪い知らせがありますが、それはうまくいかないでしょう。システムは破壊されません。 –