随机取数

转自:http://blog.chinaunix.net/uid-23781137-id-3155503.html

标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数:
函数一: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<<ran_numf<<" ";
}
运行结果为: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 <stdio.h>

#include <stdlib.h>

#include <time.h>

 

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<iGuess) puts ("The secret number is lower");

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

  } while (iSecret!=iGuess);

 

  puts ("Congratulations!");

  return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值