2

下面,但它总是给我 42 作为 SIZE。我想用 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() 之前调用rand()以初始化随机数生成器。

您可以尝试srand( time( NULL ) )每秒一次给您不同的结果。如果您需要它比这更具可变性,那么您将不得不想出一种更好的方法来播种数字生成器。

int i,numberToBeFound;
int SIZE;
int *array2;

srand( time( NULL ) );

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

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

PS:您不应该malloc()在 C 中强制转换 - 请参阅这篇文章

于 2013-05-02T18:35:20.003 回答
3

您在评论中说,如果您调用srand()before rand(),您的编译器将不接受它。

那是因为您的编译器(Microsoft?)正在执行 C89/C90 规则,这些规则不允许声明跟随块内的语句。

您可以通过添加新块来解决该限制。粗略的大纲:

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

或者你可以删除 and 的初始化器sizearray2在调用之后用赋值替换它们srand()。就个人而言,我更喜欢尽早初始化变量。

一般来说,您应该srand()在程序中只调用一次,然后再调用rand(). (这是您想要不重复的伪随机数的最一般情况;如果您确实需要可重复的序列,则适合采用不同的策略。)

(如果没有调用srand()rand()就好像你调用了srand(1),并且每次都生成相同的序列。)

(我已将变量的名称更改SIZEsize;全大写标识符通常用于宏。)

于 2013-05-02T18:41:50.763 回答
1

为了不总是从你那里得到相同的结果,rand你需要在srandrand. 因此,您只需在srand呼叫前将您的呼叫移动到一个地方rand

于 2013-05-02T18:41:57.967 回答