2013-05-02 50 views
2

下面但它总是给我42作为SIZE。我想用srand(time(NULL))随机化SIZE,但显然它不起作用,因为它低于SIZE的随机化。当我在SIZE的随机化之前尝试添加它时,编译器向我大喊。你有任何想法如何纠正它?srand()在随机初始化阵列下工作不起作用

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; 
+3

使用'rand()'调用'srand' _before_。 – 2013-05-02 18:35:06

+0

它给了我15个错误和9个警告如果我这样做 – Lyrk 2013-05-02 18:37:11

+2

我认为当他将srand移动到rand以上时,他看到的错误是声明之前的代码。 – 2013-05-02 18:37:53

回答

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

+0

他叫'srand(time(NULL))';问题在于,在调用rand()初始化SIZE之后,他会这样做。 (你的代码调用'srand()'两次,这很少是个好主意。) – 2013-05-02 18:36:34

+0

啊...... doh。一旦我看到他还没有调用'srand()',我没有看过'rand()'调用。 〜lol〜据此编辑。 – 2013-05-02 18:38:46

+0

我已经知道我必须在rand之前调用srand,但是因为我使用的是Visual Studio,所以当我在rand之前放置srand时,编译器不接受它。我问是否有解决方法。 – Lyrk 2013-05-02 18:38:50

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或更老)。所以申报你的当地人,然后初始化他们,最后根据需要使用他们。

+0

这仍然没有随机化SIZE,因为种子是在rand调用之后完成的。 – typ1232 2013-05-02 18:39:22

+0

您仍然在'srand()'之前调用'rand()'。它不是C,它是C89 [过时,无效,不好]。 – 2013-05-02 18:39:33

+1

这不是问题......问题是他没有在**之前调用'srand()'**他叫'rand()' – 2013-05-02 18:39:35

3

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

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

您可以通过添加新块来解决该限制。粗线条:

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

或者,你可以调用srand()后删除初始化为sizearray2,与分配替换它们。就个人而言,我倾向于尽早初始化变量。

一般来说,在拨打rand()之前,您应该只在您的程序中拨打srand()一次。 (这是最常见的情况下,你想要非重复的伪随机数;如果你真的需要一个可重复的序列,一个不同的策略是适当的)。所谓srand(1),并产生相同的序列每次)

(我已经改变了你的变量SIZEsize的名称;全大写的标识符通常用于宏)

+0

代码的一些小的重新排序是所有需要的。 – StarPilot 2013-05-02 18:43:54

+0

这真是太棒了,谢谢 – Lyrk 2013-05-02 18:49:22

+0

,srand的功能创造是天才,成为一种解决方法。谢谢 – Lyrk 2013-05-02 19:03:17

1

拿不到总是与rand相同的结果,您需要使发电机与一起播种在拨打电话rand之前,请拨打。因此,您只需在致电rand之前将您的srand呼叫转移到某个地方。