您的位置:首页 > 其它

关于随机数的一个简单的整理

2010-12-12 16:59 183 查看
随机函数一些粗浅的基础,不对的地方请指正

声明:
首先计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。而伪随机数不是假随机数,“伪”是指有规律的意思,
就是产生的随机数既是随机的又是有规律的。产生的伪随机数有时是有规律的,有时是没规律的;有一部分是有规律的,有一部
分是没规律的。






一 有用否?不用咱学它干嘛?





随机函数在考试系统中的随机抽题(这个好讨厌啊),扑克游戏的自动发牌(你可能经常玩的),密码学(难道梦幻将军令



就是这么来的?)等领域都有广泛应用 当然应用领域还等待后人继续搞kuo研。

二 随机函数有哪些?
1.rand()函数
原型: int rand(viod)
功能:产生从0到RAND_MAX(0x7fff)之间的随机数。
头文件 stdlib.h
资料上说明“当你利用rand()来生成随机数时,产生的随机数每次循环都是一样的”而当你输入以下代码时你可能会大骂
写这样说明的人脑子进水了,就算他爸是李刚都要暴打他一顿。
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i;
int a[5];
for(i=0;i<5;i++)
{
a[i]=rand();
printf("%d/n",a[i]);
}
system("pause");
return 0;
}






我的编译器执行后结果是41 18467 6334 26500 19169 你也许会问这不是不一样吗?但是关闭程序再执行一次,我发现





结果还是41 18467 6334 26500 19169 我不服气,又试了N遍,好吧,算你狠,结果还是一样。 请静静地思考



ok, now,我想你对那句“每次循环都是一样”的话应该是理解了吧,然而悬念+纠结产生了,我这本来想产生随机数字的,结果你

产生的不是真正的随机,不给力啊,怎么办?他是干什么吃的呢?
简单的说int rand(void)
它是从srand(seed)中指定的seed开始,返回一个[seed,RAND_MAX(0x7fff)]间的随机整数






可以这样理解 rand()在每次被调用的时候,它会查看





(1)如果用户在这之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值



(2)如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次

所以,如果我们想得到真正的随机数,就要让seed不一样,这个解决方案先暂时搁置下,先解决srand()函数是神马东东。
2. srand()函数
原型 void srand(unsigned seed)
功能:产生随机数的起始发生数据,和rand函数配合使用
头文件:stdlib.h time.h
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int i;
int a[5];
time_t t;
srand( (unsigned) time(&t) );
for(i=0;i<5;i++)
{
a[i]=rand();
printf("%d/n",a[i]);
}
system("pause");
return 0;
}
执行第一次19530 24291 26062 1116 111
第二次19641 29288 10852 69 23126
第三次19781 32718 25347 18984 7901
第四次19968 22785 27797 14336 6008
第五次20088 27260 643 19943 277199
数字是不一样了,但是我们会发现第1个数 第2数 甚至第三个数都惊人的相近。产生的随机数其实是“伪”随机数;












小扩展 产生一个X到Y的“伪”随机整数









只要这样写就OK了:





k=rand()%(x-y+1)+x;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: