随机数生成方法小结

前言:

生成随机数是程序中经常要实现的一个小功能模块,其生成方法是程序员的必备基本功;
这里将有关生成随机数有关的函数及生成的思路简单总结。

正文:
1.rand()函数:
原型:int rand();
头文件:#include<cstdlib>
返回值:返回一随机数,范围在0至RAND_MAX之间,其中RAND_MAX定义在stdlib.h
中;
技巧:

可通过求余运算调整返回随机数的范围,例如rand()%10 则返回0到9之间的随机数。

生成随机数程序:

#include <iostream>
#include <cstdlib>
using namespace std;
void main()
{
 cout<<rand()%10;
}


程序分析:
该随机数生成方法是一次性的,只有第一次运行时的生成数不可预测,重复执行
的结果均为可预测的,在我的系统上为1;
原因:
rand()函数的返回值由随机数种子决定,当不指定种子是默认为1;
故每次种子值为1,相应的生成的随机数也为一确定值;

改进1
思路:

每次用srand()函数 设定不同的种子 ;
函数原型:void srand(unsigned seed)
头文件:#include<cstdlib>
用seed值初始化种子
当保证每次执行时seed值不同时,则可到达随即产生器生成的值不可预测之效果
#include <iostream>
#include <cstdlib>
using namespace std;
void main()
{
 int seed;
 cin>>seed;
 srand(seed);
 cout<<rand()%10;
 
}
程序分析:
每次执行时手工设定seed值,达到每次产生随机值不可预测的效果
缺陷:
每次需要手工设定,麻烦!
解决方法:
设法找到一个自动不停变化的值,将seed设为该值,每次执行时自动产生
一个变化的值,时间 是一个不断 更新的值 ,故可为我等所用;

改进2:
用 time()实现seed值的自动更新
函数原型:time_t time(time_t * timer)
头文件:#include <ctime>
返回从1970年1月1日00:00:00到当前时刻的秒数;
思路:将其返回值作为seed,直接作为srand()的参数;
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void main()
{
 
 srand(time(NULL));
 cout<<rand()%10;
 
}
程序分析:
至此,基本实现每次执行时随机数不可预测之效果!

posted @ 2012-03-25 12:00  liuhao2638  阅读(285)  评论(0编辑  收藏  举报