1

CでN組の乱数を生成する簡単なプログラムがあります.

私はrand()これに使用しています。N の値は、コマンド ライン パラメータです。

渡されたコマンドライン引数が同じ場合、常に同じ数字のストリームが生成されることに気付きました。

マンページによると、rand()明示的なシードがない場合、RNG は値 1 によって暗黙的にシードされます (srand()私のプログラムには呼び出しがありません)。

しかし、arg=10 でプログラムを呼び出し、次に arg=12 でプログラムを呼び出すと、両方のシーケンスの最初の 10 桁が等しいと見なされるはずですよね? (どちらも同じシード、つまり 1 を使用します)。これは起こっていません。暗黙的に渡された引数からシードが派生および適用されているように見えますが、そうではないようです。何か案は?

更新: [これを以前に投稿して申し訳ありません]

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])  
{  
    int objs=100, i;  
    if (argc >= 2)  
        objs = atoi(argv[1]);

     for(i=0; i<objs; i++){
         int p = rand() % objs;
         int q = rand() % objs;
         printf("%d %d\n", p, q);
      }
      return 0;
}

Ubuntu 12 と gcc 4.7.2 を使用しています。

4

3 に答える 3

6

int バージョンの rand は、0 から RAND_MAX までの乱数を生成します。これらの int は、同じシードで同じになります。ただし、コードには、その数値を 0 ~ 10 または 0 ~ 12 の範囲の数値に変換する別のステップが必要です。そのスケーリングは、出力の違いの原因となります。

たとえば、除算を使用し、rand が 25 を返す場合、次のようになります。

// for range 0..10,
25 / 11 => 2 (truncated)

// for range 0..12,
25 / 13 => 1 (truncated)
于 2012-12-02T12:13:31.097 に答える
1

投稿されたコードに基づいて、出力の違いは、実行されている乱数の係数によるものと思われます。

于 2012-12-02T12:19:45.733 に答える
0

両方のシーケンスの最初の 10 桁は等しくありません。これrand()は、同じシード (関数によって管理される) を持つ同じ値 (a を呼び出す) を返すためですsrand()が、ステートメントa % objsは objs の値に応じて異なる値を返します。つまり、12 で除算してその余りを取得することに注意してくださいa % 12。したがって、%12 と %10 の場合、異なる値が得られます。

これがあなたを助けることを願っています

于 2012-12-02T16:35:00.380 に答える