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

本文介绍如何使用C语言中的rand()和srand()函数生成伪随机数,并通过实例演示如何获得更接近真正随机数的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 随机函数一些粗浅的基础,不对的地方请指正

声明:

首先计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。而伪随机数不是假随机数,“伪”是指有规律的意思,

就是产生的随机数既是随机的又是有规律的。产生的伪随机数有时是有规律的,有时是没规律的;有一部分是有规律的,有一部

分是没规律的。

 

 

 

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

 

 

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

 

就是这么来的?)等领域都有广泛应用    当然应用领域还等待后人继续搞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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值