2011-11-29 34 views
7

我写了下面的C代码,当我循环时,它返回一个随机数。如果myrand()被执行,我怎样才能达到5个不同的随机值?兰德与种子不返回随机函数循环

#include <stdio.h> 
#include <stdlib.h> 

int myrand() { 
    int ue_imsi; 
    int seed = time(NULL); 
    srand(seed); 
    ue_imsi = rand(); 

    return ue_imsi; 
} 

int main() 
{ 
    int value = 0; 
    int i=0; 
    for (i=0; i< 5; i++) 
    { 
     value =myrand(); 
     printf("value is %d\n", value); 
    } 
} 
+8

Seed **曾经**在你的生活中,而不是所有的时间。 –

+0

您正在使用相同数字重复初始化随机数生成器(只要'time(NULL)'返回相同的值)。不要这样做,如果你想让数字看起来像随机。还要记住'#include '为'time()'原型。 – pmg

+1

[总是重复的数字由rand()给出的可能的重复](http://stackoverflow.com/questions/4859089/always-repeated-numbers-given-by-rand)。在提问前请使用SO的搜索功能。 –

回答

19

播种发电机应做一次(你想生成的随机数的每个序列当然!):

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int seed = time(NULL); 
    srand(seed); 
    int value = 0; 
    int i=0; 
    for (i=0; i< 5; i++) 
    { 
     value =rand(); 
     printf("value is %d\n", value); 
    } 
} 
+0

兰特()可能有一个低周期,所以我仍然会调用srand时间(如果在一个大循环中) –

4

移动电话srand()进入main(),在循环之前。

换句话说,调用srand()一次,然后调用rand()反复,没有任何进一步的调用srand()

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int value = 0; 
    int i = 0; 
    srand(time(NULL)); 
    for (i = 0; i < 5; i++) 
    { 
     value = rand(); 
     printf("value is %d\n", value); 
    } 
} 
+0

errr。是的,它的工作。但为什么? – xambo

+2

@xambo:当你连续几次调用'time()'时,它很可能会返回相同的值,因为时钟没有打勾。当你用同样的种子调用srand()时,以下对rand()的调用将返回相同的值。正如我所说的,不要在每次需要随机值时重新初始化发生器。 – NPE

0

种子的点()是与已知值开始的随机数序列,
然后你会总是得到给定相同种子的相同数字序列。

这就是为什么你必须种子(),它都可以让你生成测试相同的序列,或给予一个随机种子(通常是时间)每次

2

试试这个你会得到不同的序列:

#include <stdio.h> 
#include <time.h> 
int main(void) { 
    for (int i = 0; i < 10; i++) { 
     printf("%ld\n", (long)time(NULL)); 
    } 
} 

我“猜”是10个等于值将被打印出来:)

+0

这不是一个答案。 (_但它确实解释了OP_的部分问题) – JeromeJ

-1

如果你想补种(用于额外随机性)每次调用random()时间,这里是你可以做一个塔路T:

srandom(time(0)+clock()+random()); 
  • time()每秒钟更新一次,但会有所不同每次运行您的程序太多
  • clock()更新更频繁,但是从0开始,每次时间运行您的程序
  • random()如果您的循环比粒度更快,请确保您(通常)不会连续两次使用相同的值重新编号。clock()

当然,如果你真的需要随机性,你可以做更多 - 但这是一个开始。

+0

Oops - 使用'clock()'在这里不会增加太多价值,因为如果你的程序没有任何I/O延迟,那么它大致是确定性的。 – nobar

+0

那么除非你始终得到0,否则时钟将会增加至少一些额外的熵,所以它很重要。 – this

+0

http://scruss.com/blog/2008/10/12/pgmrnoise-a-more-random-or-less-repeatable-pgmnoise/ – nobar