私はCのrand()
を使って擬似乱数ジェネレータのランダム入力を初期化しようとしています。私が使用しているPRNGテストライブラリの制約のため、ジェネレータ関数はパラメータを受け付けることができないので、初期値をグローバル変数として保存する必要があるようです。ランダムグローバル変数のためのrand()のシード
理想的には、私はsrand(time(NULL))
でジェネレータをシードしますが、これはグローバルに行うときに「初期化要素がコンパイル時定数ではありません」というエラーをスローします。
これを行う最も簡単な方法は何ですか?これまでのところ私はこのように、関数にグローバル変数を渡し、そこに仕事をして作ってみた:
unsigned int* w;
unsigned int* x;
unsigned int* y;
unsigned int* z;
void seed (unsigned int* first, unsigned int* second, unsigned int* third, unsigned int* fourth)
{
srand((unsigned int) time(NULL));
unsigned int a = rand();
unsigned int b = rand();
unsigned int c = rand();
unsigned int d = rand();
first = &a;
second = &b;
third = &c;
fourth = &d;
}
しかし、私がメインで私の値にアクセスしようとしたとき、私はXcodeでEXC_BAD_ACCESS
エラーが出ます:私は推測している
int main (void)
{
seed(w, x, y, z);
printf("%i", *w); // throws error
...
}
は...スコープと私はそれになりたいの前に解放されたメモリとは何かを持っています。 Cに多大な経験はありませんが、これは正しいアプローチですか?どうすればこのエラーを修正できますか?
ありがとうございます!あなたはseed()
戻り
? 'rand()'はひどくひどいです。 – tadman
プログラムの実行は 'main()'から始まり、可能であれば他の関数に実行されます。私は 'main()'が始まる前に 'srand()'のような関数を使うとエラーになると思います。言い換えれば、コンパイル時に知られている値だけが行います。 –
@tadmanあまりランダムではありませんが、覚えているとおり、これらは私がprngに初期値として渡している値だけです。だから、私はあなたのことを考えると、私の種子を無作為化しているのです。私は自分の入力でハードコーディングするのではなく、このようにしてランダムテストのバッテリーがどれくらいうまくいくかを見たいと思っています。 – Davigor