2

以下ですが、常にサイズとして42が表示されます。srand(time(NULL)) で SIZE をランダム化したかったのですが、SIZE のランダム化を下回っているため、明らかに機能していません。SIZE のランダム化の前に追加しようとすると、コンパイラーが怒鳴ります。それを修正する方法はありますか?

int i,numberToBeFound;
int SIZE=(rand()%100)+1; // size can be in the range [1 to 100]
int *array2 = (int*) malloc(sizeof(int)*SIZE);

srand(time(NULL));

for(i=0;i<SIZE;i++)     //fill the array with random numbers
    array2[i]=rand()%100; 
4

4 に答える 4

4
int i, numberToBeFound;
int SIZE=0;
int* array2=0;

srand(time(NULL));

SIZE=(rand()%100)+1; // size can be in the range [1 to 100]
array2 = (int*) malloc(sizeof(int)*SIZE);

for(i=0;i<SIZE;i++)     //fill the array with random numbers
    array2[i]=rand()%100;

エンシェント C (C89 以上) です。したがって、ローカルを宣言してから初期化し、最後に必要に応じて使用します。

于 2013-05-02T18:38:05.217 に答える
3

コメントで、srand()beforeを呼び出すrand()と、コンパイラはそれを受け入れないと言います。

これは、コンパイラ (Microsoft?) が C89/C90 規則を適用しているためです。この規則では、宣言がブロック内のステートメントに続くことは許可されていません。

新しいブロックを追加することで、この制限を回避できます。大まかな概要:

srand(time(NULL));
{
     int size = rand() % 100 + 1;
     /* ... */
}

sizeまたは、との初期化子を削除して、array2を呼び出した後に割り当てに置き換えることもできますsrand()。個人的には、できるだけ早く変数を初期化することを好みます。

一般に、 を呼び出すsrand()前に、プログラム内で 1 回だけ呼び出す必要がありますrand()。(これは、繰り返しのない疑似乱数が必要な最も一般的なケースです。実際に繰り返し可能なシーケンスが必要な場合は、別の戦略が適切です。)

( を呼び出さないと、 が呼び出されたかのようsrand()rand()動作し、srand(1)毎回同じシーケンスが生成されます。)

(私はあなたの変数の名前を に変更しましSIZEsize。すべて大文字の識別子は慣習的にマクロに使用されます。)

于 2013-05-02T18:41:50.763 に答える
1

から常に同じ結果が得られるとは限らないため、 を呼び出す前にrandジェネレーターをシードする必要があります。そのため、電話をかける前に、電話をある場所に移動するだけで済みます。srandrandsrandrand

于 2013-05-02T18:41:57.967 に答える