当前位置: 技术问答>linux和unix
关于产生随机数的函数srand()函数问题
来源: 互联网 发布时间:2016-04-14
本文导语: 为什么有时候设置种子的时候写的是srand(getpid())?是什么意思? 如果这样设置,每次运行返回的随机数序列是否一样? | 参数srand的作用就是给rand()提供种子. 函数一:int rand(void); 从srand (se...
为什么有时候设置种子的时候写的是srand(getpid())?是什么意思?
如果这样设置,每次运行返回的随机数序列是否一样?
如果这样设置,每次运行返回的随机数序列是否一样?
|
参数srand的作用就是给rand()提供种子.
函数一:int rand(void);
从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。
函数二:void srand(unsigned seed);
参数seed是rand()的种子,用来初始化rand()的起始值。
可以认为rand()在每次被调用的时候,它会查看:
1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用
srand(seed)一次来初始化它的起始值。
2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。
根据上面的第一点我们可以得出:
1) 如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。
2) 否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得的值。
3) 如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。
函数一:int rand(void);
从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。
函数二:void srand(unsigned seed);
参数seed是rand()的种子,用来初始化rand()的起始值。
可以认为rand()在每次被调用的时候,它会查看:
1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用
srand(seed)一次来初始化它的起始值。
2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。
根据上面的第一点我们可以得出:
1) 如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。
2) 否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得的值。
3) 如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。
|
如果getpid()的返回值一样,那返回的随机数应该就是一样的。
|
伪随机数
|
种子不一样,返回的随机数也不一样,主要起这个作用吧.
|
getpid 返回调用进程的ID号,可能会一样。
返回的随机数的序列不管传入的种子是否一样都不应该一样,否则这个函数就不能
叫这个名字了
返回的随机数的序列不管传入的种子是否一样都不应该一样,否则这个函数就不能
叫这个名字了
|
getpid()取得进程号,每次运行进程,它得到的进程号吗会不同(也可能相同,比如说关了又开的时候),
这样设置种子后,每次随机取得的值就不同了
这样设置种子后,每次随机取得的值就不同了
|
如果在同一次进程内这样调用,那产生的伪随机数列也是相同的。
伪随机数列的种子值相同,产生的伪随机数列也是相同的。
伪随机数列的种子值相同,产生的伪随机数列也是相同的。
|
re:LZ
srand() in order to choose a number to become seed.
I think because getpid()'s value is hard to same when this process is called every time,so it's no problem.
If this process always live,it just involve the seed,of course, it make impact on the trajectory of the random numbers.but what's the big deal?
If you care,suggest you use getdate() as random numbers' seed.
srand() in order to choose a number to become seed.
I think because getpid()'s value is hard to same when this process is called every time,so it's no problem.
If this process always live,it just involve the seed,of course, it make impact on the trajectory of the random numbers.but what's the big deal?
If you care,suggest you use getdate() as random numbers' seed.
|
还是用时间作为种子吧,这样更安全些啊
srand(time(NULL))
srand(time(NULL))
|
顶这个
|
得看实际使用的需求。如果在一次运行程序里就是要求随机序列一样楼主的方法很好,如果要求每次都不一样,可以考虑srand(time(null));
这跟安全没有任何关系啊,我srand(1)最安全,加一个time还有可能出错呢。
这跟安全没有任何关系啊,我srand(1)最安全,加一个time还有可能出错呢。
|
srand是给rand()函数设置种子的, 如果设置的种子值为一个定值,则每次rand返回的随机序列是相同的.
getpid()在每次程序重新运行的时候显然会和前一次运行的时候不一样.
getpid()在每次程序重新运行的时候显然会和前一次运行的时候不一样.