Chinaunix首页 | 论坛 | 博客
  • 博客访问: 629018
  • 博文数量: 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_MAX0x7fff)间的随机整数。
函数二:void srand(unsigned seed)
参数seedrand()的种子,用来初始化rand()的起始值

rand函数

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

C++标准函数库提供一随机数生成器rand,返回0RAND_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~1010个整数,可以表达为:
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]之间的一个随机数.

a0的情况下,简写为rand() % b

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

  获取随即小数:

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

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

srand

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

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

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


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

 

下面是一个猜数字游戏:

/* 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;

}

 

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