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

10 に答える 10

21

srand()ループの外で呼び出します。反復ごとに再シードしています。

srand()乱数ジェネレーターをシードして、入力に応じて異なるシーケンスの乱数を取得します。ループが非常に高速に実行されるため、 への呼び出しはtime(NULL)常に同じ値を返します。反復ごとに同じランダムシーケンスにリセットしています。原則として、srand()プログラム内で 1 回だけ呼び出します。

于 2010-03-15T18:23:47.930 に答える
6

srand()ループを毎回呼び出すのではなく、事前に 1 回だけ実行してください。

于 2010-03-15T18:23:59.623 に答える
4

FAQ13.15から13.20が興味深いでしょう。そして、私はそのような質問のために新しいタグを作成したいと思っています。

于 2010-03-15T18:28:55.290 に答える
3

srandは、乱数ジェネレーターを「シード」する関数です。ご存じないかもしれませんが、コンピューターの乱数は実際にはランダムではありません。事実上、コンピューターにはランダムに見える番号のリストがあり、srandそのリストのどこから開始するかを指示するために使用します。各呼び出しrand()で、リスト内の次の項目が返されます。

あなたが書く理由srand(time(NULL))は、あなたがプログラムを実行するたびに同じになることはないであろうある時点で乱数を開始させるためです(プログラムが同時に開始しない限り)。

したがって、ここで行っているのは、同じ時点で乱数リストを再開するようにプログラムに繰り返し指示することです(ループを通過するたびに時間が同じであるため)。呼び出しをsrandループの外側に移動すると、正しい結果が得られます。

于 2010-03-15T18:28:35.493 に答える
3

代替テキスト

于 2010-03-16T00:12:57.633 に答える
2
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 を 1 回呼び出します。

于 2010-03-15T18:25:19.200 に答える
1

srand()ループに入る前に呼び出す必要があります。srand()指定されたシードで乱数ジェネレーターを初期化し、このシードに対して一意の乱数シーケンスを生成します。

ループは非常に高速に実行されるため、を呼び出すたびtime(NULL)に同じ時間が発生します(秒単位で測定)。したがって、ループの反復ごとに同じシードを使用して乱数ジェネレーターを初期化します。

于 2010-03-15T18:28:52.137 に答える
0
srand(time(NULL));
for(i = 0; i < n; i++){
    for(j = 0; j < (n-1); j++){
        a[i,j] = rand();
    }
}

どんなに。数は同じ...

于 2010-03-15T18:35:36.523 に答える
0

a[i,j]Sergey さん、これは完全に有効な式であるため、このバージョンのエラー メッセージは表示されませんでした。コンマ演算子は、部分式を左から右に評価し、最後の式の値を返します。したがって、書き込みa[i,j]は と同じですa[j]。プリントで受け取ったのは、行列の j 番目のベクトルへのポインターの値です。

于 2010-03-16T00:10:50.527 に答える
0
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));

これが私の配列です...

于 2010-03-15T18:58:11.690 に答える