2017-09-07 8 views
0

私は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()戻り

+0

? 'rand()'はひどくひどいです。 – tadman

+0

プログラムの実行は 'main()'から始まり、可能であれば他の関数に実行されます。私は 'main()'が始まる前に 'srand()'のような関数を使うとエラーになると思います。言い換えれば、コンパイル時に知られている値だけが行います。 –

+0

@tadmanあまりランダムではありませんが、覚えているとおり、これらは私がprngに初期値として渡している値だけです。だから、私はあなたのことを考えると、私の種子を無作為化しているのです。私は自分の入力でハードコーディングするのではなく、このようにしてランダムテストのバッテリーがどれくらいうまくいくかを見たいと思っています。 – Davigor

答えて

2

あなたは上だけに存在する値へのポインタを代入しているときに無効になりますあなたのポインタ

これらの変数とそのアドレスへseed()からローカル変数のアドレスを割り当てているので、

0

EXC_BAD_ACCESSですあなたが思っているように物事を押し戻さないでください。そのスタックが範囲外になると、あなたは危険な領域に入ります。ここで

は、それが書かれるべき方法は次のとおりです。

void seed (unsigned int* a, unsigned int* b, unsigned int* c, unsigned int* d) 
{ 
    srand((unsigned int) time(NULL)); 
    *a = rand(); 
    *b = rand(); 
    *c = rand(); 
    *d = rand(); 
} 

int main() { 
    // Note: These can be global, they're just put here for convenience 
    // Remember, global variables are bad and you want to avoid them. 
    unsigned int a, b, c, d; 
    seed(&a, &b, &c, &d); 

    // ... 
} 
1

変数a, b, c, dの範囲は、シード関数内にあるので、関数の外でこれらの参照にアクセスすると、予期しない結果が発生します。
seed機能で各アドレスにメモリを割り当てるか、または割り当てるために変数のアドレスを渡す必要があります。

は、以下試してみてくださいスニペット

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)); 

    *first = rand(); 
    *second = rand(); 
    *third = rand(); 
    *fourth = rand(); 
} 


int main (void) 
{ 
    seed(&w, &x, &y, &z); 
    printf("%i", w); 
} 
これらの数字はする必要がありますどのようにランダム
関連する問題