关于rand()函数srand()函数的使用(转)


关于rand()函数srand()函数的使用 (2011-04-26 14:25:41)
标签:

杂谈

分类: 是IT耶~

早上上机实验,老师当场布置一个实验。大块的兴趣没有,只记得有一个有意思的任务,产生8*8个100以内的随机数。一看我就happy了。直接rand()0上去了,运行的时候是很开心因为产生的数看起来是随机的。实验多次之后发现了,每次产生了许多的随机数是一样样的,这样难道就随机了?

于是下课后,饭也不吃,打开电脑,查阅资料。(发现自己神经病~)

好吧先解释下原因:rand()函数产生的是伪随机数。需要srand()函数来提供种子seed来能变成真正的随机数。哦,顺便说一句这两个函数的头文件是放在#include "stdlib.h"的。

以上是碰到问题的第一步。

问题一:产生的随机数不含100?

这问题纠结了,试验多次均为发现100。说明程序很大一部分存在bug。

源代码:(VS2010强大的编程工具下)

#include "stdafx.h"
#include "stdlib.h"
#include "time.h"//这个不能丢
int _tmain(int argc, _TCHAR* argv[])
{
 srand((unsigned)time(NULL));//srand()在循环体外
 int i,obj;
 for(i=0;i<8*8;i++)
 {

obj=rand()0;

 printf("%d ",obj);
 }
 system("Pause");
 return 0;
}

产生的结果没有含有一百。

后来查看才知道,符合条件的代码应该是:obj=1+(int)(100.0*rand()/(RAND_MAX+1.0));

其中:

    RAND_MAX是VC中stdlib.h中宏定义的一个字符常量:

  #define RAND_MAX 0x7FFF

  其值最小为32767,最大为2147483647
因为产生是100以内的随机数就是100.0*若是产生n以内就用n的double形式乘以。

 

问题二:把srand()放在循环体内有意思的事情又发生了:代码如下:

// radom.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdlib.h"
#include "time.h"
int _tmain(int argc, _TCHAR* argv[])
{
  int i,obj;
 for(i=0;i<8*8;i++)
 {
  srand((unsigned)time(NULL));//在循环体内
 obj=1+(int)(100.0*rand()/(RAND_MAX+1.0));

 printf("%d ",obj);
 }
 system("Pause");
 return 0;
}

情况变成所有的值都一样了。真是无比纠结。

srand()函数调用的是时间函数。每次都查看系统时间,由于执行的时间很短系统把它看成是同一时间,所以读取出来的数据是一样的。

而产生随机数只要看一次系统时间就好了。

 

问题解决。正确的代码:


// radom.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdlib.h"
#include "time.h"
int _tmain(int argc, _TCHAR* argv[])
{
 srand((unsigned)time(NULL));
 int i,obj;
 for(i=0;i<8*8;i++)
 {
   
 obj=1+(int)(100.0*rand()/(RAND_MAX+1.0));

 printf("%d ",obj);
 }
 system("Pause");
 return 0;
}

基础很漂浮才导致这种结果,暂不截图鸟~~

为毛我的rand()  100会变成rand()O了?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值