質問
for(i = 0; i < n; i++){
srand(time(NULL));
printf("%d ", time(NULL));
for(j = 0; j < (n-1); j++){
a[i][j] = rand();
}
}
私はsrand(i * time(NULL))
を試してみてください...私は乱数を生成しようとするが、彼らは同じです。どんなに..
私は何をすべきでしょうか?
配列宣言
int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);
a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
a[i] = (int*)calloc(n-1, sizeof(int));
解決
ループの外に呼び出しsrand()
。あなたはそれすべての反復再播種されています。
srand()
種子あなたが入力に応じて、異なる乱数の列を得るように、乱数ジェネレータ。あなたのループは非常に高速に実行するので、time(NULL)
の呼び出しは、常に同じ値を返します。あなたは、反復ごとに同じ乱数列にリセットされます。一般的なルールとして、あなただけのプログラムで一度srand()
を呼び出します。
他のヒント
ループを通るたびにsrand()
呼んではいけない - 一度だけ、事前にそれを行う
よくあるご質問 13.15 の.COM / libに/ gaussian.html」のrel = "nofollowをnoreferrer"> 13.20 には、対象としています。そして私は、このような質問のための新しいタグを作成するように誘惑しています。
srand
は「シード」乱数ジェネレータその関数です。あなたが知っていない場合は、コンピュータで乱数が本当にランダムではありません。実際には、コンピュータはそれにランダムに見える番号のリストを持って、あなたはどこリスト内の次の項目を返すsrand
する各呼び出しで、そのリストに開始するように指示するrand()
を使用します。
あなたはsrand(time(NULL))
書く理由は、(プログラムが同時に起動していない限り)あなたがプログラムを実行するたびに同じであることを行っていないいくつかの時点で開始するように乱数を取得することです。
それでは、あなたはここでやっていることは、繰り返し同じポイントで乱数のリストを再起動するプログラムを語っています。ループの外srand
すると、正しい結果が得られますコールを移動します。
srand(time(NULL));
for(i = 0; i < n; i++){
printf("%d ", time(NULL));
for(j = 0; j < (n-1); j++){
a[i,j] = rand();
}
}
一度ループの外にsrandを呼び出します。
あなたはループに入る前srand()
を呼び出す必要があります。 srand()
は、所与の種とradnom番号生成器を初期化し、この種のための乱数の一意のシーケンスを生成します。
あなたのループが非常に速く実行されるので、time(NULL)
のすべての呼び出しは、(秒で測定)と同じ時間を生み出す - ので、あなたはすべてのループの繰り返しで同じシードで乱数ジェネレータを初期化する
srand(time(NULL));
for(i = 0; i < n; i++){
for(j = 0; j < (n-1); j++){
a[i,j] = rand();
}
}
どんなに。数が同じである...
int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);
if( n < 1 ){
printf("Size should be > 0\n\n");
return NULL;
}
a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
a[i] = (int*)calloc(n-1, sizeof(int));
...ここで私の配列です。
セルゲイは、あなたが、これは完全に有効な式であるという理由だけでa[i,j]
バージョンでエラーメッセージを取得できませんでした。コンマ演算子は左から右へサブ式を評価し、最後の式の値を返します。したがって、a[i,j]
を書くことa[j]
と同じです。何が印刷で受信すると、あなたの行列のj番目のベクトルへのポインタの値だった。