srand()在随机数组初始化之后无法正常工作

时间:2013-05-02 18:33:42

标签: c random srand

下面但它总是给我42大小。我想用srand(时间(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 个答案:

答案 0 :(得分: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或更老)。所以声明你的本地人,然后初始化他们,最后根据需要使用它们。

答案 1 :(得分: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:你不应该在C中投射malloc() - 见this post

答案 2 :(得分:3)

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

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

您可以通过添加新块来解决该限制。粗略概述:

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

或者,您可以删除sizearray2的初始值设定项,并在调用srand()后将其替换为分配。就个人而言,我更喜欢尽早初始化变量。

一般来说,在调用srand()之前,您应该在程序中只调用rand()一次。 (这是最常见的情况,你需要非重复的伪随机数;如果你真的需要一个可重复的序列,那么另一种策略是合适的。)

(如果不调用srand()rand()的行为就好像您已拨打srand(1),并且每次都生成相同的序列。)

(我已将变量SIZE的名称更改为size;所有大写标识符通常用于宏。)

答案 3 :(得分:1)

要从rand得到相同的结果,您需要在对srand进行任何调用之前使用rand为生成器播种。因此,您只需在致电srand之前将rand来电转移到某个地方。