Chinaunix首页 | 论坛 | 博客
  • 博客访问: 645485
  • 博文数量: 87
  • 博客积分: 3399
  • 博客等级: 中校
  • 技术积分: 1422
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 21:20
文章分类

全部博文(87)

文章存档

2013年(1)

2012年(51)

2011年(33)

2010年(2)

分类: C/C++

2012-03-30 20:56:12

标准库(被包含于中)提供两个帮助生成伪随机数的函数:
函数一:int rand(void);
从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。
函数二:void srand(unsigned seed);
参数seed是rand()的种子,用来初始化rand()的起始值

一 rand函数

● random函数不是ANSI C标准,不能在gcc, vc等编译器下编译通过。

● C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。RAND_MAX Its default value may vary between implementations but it is granted to be at least 32767.

● rand()函数不接受参数,默认以1为种子(即起始值)。

●  获取某范围内的整数

( value % 100 ) is in the range 0 to 99
( value % 100 + 1 ) is in the range 1 to 100
( value % 30 + 1985 ) is in the range 1985 to 2014

如果你要产生0~10的10个整数,可以表达为:
int N = rand() % 11;

这样,N的值就是一个0~10的随机数,如果要产生1~10,则是这样:
int N = 1 + rand() % 10;
一个通用的公式是:
要取得[a,b)之间的随机整数,使用a + rand() % (b-a)

a + rand() % (b-a+1) 就表示 [a, b]之间的一个随机数.

在a为0的情况下,简写为rand() % b。

求模是必须的,这样才能确保目的随机数落在[0,b)之间,否则rand()的返回值本身可能是很巨大的。

●  获取随即小数:

若要0~1的小数,则可以先取得0~10的整数,然后均除以10即可得到随机到十分位的10个随机小数,若要得到随机到百分位的随机小数,则需要先得到0~100的10个整数,然后均除以100,其它情况依此类推。

用rand() / double(RAND_MAX)可以取得0~1之间的浮点数(注意,不同于整型时候的公式,是除以,不是求模),举例:
double ran_numf=0.0;
srand((unsigned)time(0));
for(int i=0;i<10;i++){
ran_numf = rand() / (double)(RAND_MAX);
cout<}
运行结果为:0.716636,0.457725,…等10个0~1之间的浮点数,每次结果都不同。
如果想取更大范围的随机浮点数,比如1~10,可以将
rand() /(double)(RAND_MAX)
改为 rand() /(double)(RAND_MAX/10)
运行结果为:7.19362,6.45775,…等10个1~10之间的浮点数,每次结果都不同。
至于100,1000的情况,如此类推。…

二 srand

●  函数srand(seed),可以指定不同的数(无符号整数变元)为种子seed。但是如果种子相同,伪随机数列也相同。

●  随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)

●  用变化的数,比如时间来作为随机数生成器的种子。还可以包含time.h头文件,然后使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒)。  


三 关于time_t time(0)
time_t
被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。

 

下面是一个猜数字游戏:

/* rand example: guess the number */

#include

#include

#include

 

int main ()

{

  int iSecret, iGuess;

 

  /* initialize random seed: */

  srand ( time(NULL) );

 

  /* generate secret number: */

  iSecret = rand() % 10 + 1;

 

  do {

    printf ("Guess the number (1 to 10): ");

    scanf ("%d",&iGuess);

    if (iSecret

    else if (iSecret>iGuess) puts ("The secret number is higher");

  } while (iSecret!=iGuess);

 

  puts ("Congratulations!");

  return 0;

}

 

阅读(5397) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~