回 帖 发 新 帖 刷新版面

主题:求srand和rand的解释,和用法!

srand是产生什么随机种子什么的,随机种子是什么?()里面的是什么?
rand又是什么
详细解释!

回复列表 (共10个回复)

沙发

前者是初始化,后者才是生成随机数的:)可以简单地这样理解:)

板凳

glibc里面的描述
[url]http://www.gnu.org/s/hello/manual/libc/ISO-Random.html[/url]

[quote]— Function: int rand (void)

The rand function returns the next pseudo-random number in the series. The value ranges from 0 to RAND_MAX. 

— Function: void srand (unsigned int seed)

This function establishes seed as the seed for a new series of pseudo-random numbers. If you call rand before a seed has been established with srand, it uses the value 1 as a default seed. 

To produce a different pseudo-random series each time your program is run, do srand (time (0)).
[/quote]

3 楼

我的理解是这样你看对不对
rand是按一定的规律生成随机数,但是如果我们printf("%d %d",rand(),rand());就会发现同时输出的时候是相等的,如果我们想改变这种规律就用srand来改变这种规律!使得它们每次产生的数不一样!
srand它括号里面一般用来表示生产随机数的时间间隔,改变后在调用rand(),这时printf("%d %d",rand(),rand());就产生2个不同的数了。

对不对?

4 楼

不对,连续调用rand返回值是不同的,不过,同一程序不同时间运行将得到相同结果。也许可以用下面代码解释它的一种实现原理:

#include <stdlib.h>


static unsigned int  _seek = 1U;


int rand (void)
{
  _seek *= 123456;  
  // ....  其他操作等
  _seek += 87654;  
  return (int)(_seek  % RAND_MAX);
}


void srand (unsigned int seek)
{
  _seek = seek;
}

5 楼

不好意思,还是不懂!

6 楼

rand的返回值依赖于所谓的随机种子_seek,只要_seek相同,返回值就一定相同。当第一次调用rand以前,没有人为改变_seek,它总被默认为1,因此同一程序不同时间运行都得到相同结果。但每调用rand后,_seek就会被改变,因此连续调用rand一般不会得到相同结果。srand就是用来人为改变_seek的值,一般用当前时间来初始化随机种子。这是因为每次运行程序的时间是不一样的,得到的随机序列也不一样。

7 楼

照你这么说那么[code=c]printf("%d %d\n",rand(),rand());
[/code]应该是2个不同数!

[code=c]
int i;
printf("%d",rand());
printf("%d",i+1);
printf("%d",rand());
[/code]
就应该是相同数!

可是我执行后不对啊!

8 楼

我说的同一程序不同时间是这样的:同一源代码编译成foo.exe后,今天执行得得到的2个随机数是456和789,那么明天执行还是456和789,不管什么时候运行都是。而不是同一程序不同位置,实际上,上面那两个地方都将得到不同结果。

9 楼

rand要输出返回值,需要srand函数提供一个种子,然后rand函数利用这个种子通过一个公式来求出并返回一个值。然后这个值再作为新的种子供rand函数调用。
如果没有srand的话,种子默认为1。
起始种子固定时,程序运行一次或多次的结果都是一样的。

10 楼

我对C语言不了解啊








SIGNATURE:-----------------------------------
Imagination is more important than knowledge. 
[url=http://www.vipfrees.com/nike-free-run-2-c-32.html]nike free run 2[/url]   ,     [url=http://www.vipfrees.com/nike-lunarglide-3-c-31.html]nike lunarglide 3[/url]    ,     [url=http://www.vipfrees.com/nike-free-30-c-37.html]nike free 3.0[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册