0

重複の可能性:
rand() で常に同じ乱数列を取得するのはなぜですか?

私は、 (同じマシン上で)異なるプログラムを使用して /compile を実行し、関数の (前後の) 値を削除した後でも..何があっても..同じ結果を取得し続けるという事実に困惑しています。乱数…実行するたびに。これが本来の動作方法ではないことを誓います.. できる限り簡単に説明します…</p>

#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {

    int rPrimitive = 0;  rPrimitive = 1 + rand() % 50;
    NSNumber *rObject = nil; rObject = [NSNumber numberWithInt:rand() % 10];
    NSLog(@"%i  %@", rPrimitive, rObject);

    rPrimitive = 0;   rObject = nil;
    NSLog(@"%i  %@", rPrimitive, rObject);
    return 0;           
}

TextMate で実行します。

i686-apple-darwin11-llvm-gcc-4.2
8  9
0  (null)

CodeRunner で実行します。

i686-apple-darwin11-llvm-gcc-4.2
8  9
0  (null)

必要に応じて、100 万回実行します。あなたはそれがいつもどうなるかを推測することができます. なぜこれが起こるのですか?なになになになにこれ「こう」なの?

4

3 に答える 3

6

これが理由です(randmanページから):

   If no seed value is provided,  the  rand()  function  is  automatically
   seeded with a value of 1.

常に同じ番号がシードされるため、常に同じ一連の番号が生成されます。実行するたびに異なるシーケンスを生成するには、実行するたびに異なるシードを使用する必要があります。を使用srand()してシードを設定できます。

于 2012-04-12T23:29:32.567 に答える
3

数値はランダムではないため、疑似乱数です。それらは、同じ初期シードを指定すると、常に同じ出力を生成するアルゴリズムに従って生成されます。PRNG をシードしていないため、デフォルトの定数シードが使用されます。

予測しにくいもの (現在の時刻や PID など) を使用して PRNG をシードすると、毎回異なる結果が得られます。の場合はrand(3)、 でシードする必要がありますsrand(3)

于 2012-04-12T23:30:21.527 に答える
2

そのような理由randは、疑似乱数ジェネレーターであるためです。つまり、真の乱数を生成しません (これは実際には非常に難しいことです)。「シード」を使用してシーケンスの次の番号を生成し、実行の開始時にシードは常に同じ値 (1 程度) に設定されるため、シードを変更しない場合は常に取得されます同じ乱数列。srand(time(NULL));時間に基づいて乱数ジェネレーターをシードするようなものを使用するか、暗号化の目的で十分に強力であると見なされる乱数ジェネレーターを使用できますarc4random

「どうしてこうなの?」と思うかもしれませんが、同じ一連の「乱数」を複数回生成したい場合があります。

于 2012-04-12T23:35:36.980 に答える