下面但它总是给我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;
答案 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;
/* ... */
}
或者,您可以删除size
和array2
的初始值设定项,并在调用srand()
后将其替换为分配。就个人而言,我更喜欢尽早初始化变量。
一般来说,在调用srand()
之前,您应该在程序中只调用rand()
一次。 (这是最常见的情况,你需要非重复的伪随机数;如果你真的需要一个可重复的序列,那么另一种策略是合适的。)
(如果不调用srand()
,rand()
的行为就好像您已拨打srand(1)
,并且每次都生成相同的序列。)
(我已将变量SIZE
的名称更改为size
;所有大写标识符通常用于宏。)
答案 3 :(得分:1)
要从rand
得到相同的结果,您需要在对srand
进行任何调用之前使用rand
为生成器播种。因此,您只需在致电srand
之前将rand
来电转移到某个地方。