[可直接运行] 线性同余发生器-随机数,C语言实现

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

▚ 01 简介

  1. 随机数在概率算法设计中是必须的。在计算机上无法产生真正的随机数,一般使用伪随机数发生器产生的伪随机数。
  2. 伪随机数发生器是一个算法,产生的数列元素之间近似相互独立,多数力图产生的样本同分布。
  3. 常用的伪随机数发生器:线性同余发生器、滞后Fibonacci发生器、线性反馈移位发生器、广义反馈移位发生器等。
  4. 线性同余发生器:线性同余法产生的随机序列 a1,a2,……,an,满足
    1、a0=d; 其中d称为种子
    2、an=(b*a(n-1)+c) mod m,n=1,2,……,b ≥ \geq 0, c ≥ \geq 0, d ≥ \geq m 。

在这里插入图片描述

▚ 02  线性同余发生器的示例


C语言编写,可复制粘贴后,直接运行

源码为:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;

class RandomNumber
{
private:
    unsigned long randSeed;

public:
    RandomNumber(unsigned long s = 0);             //构造函数
    unsigned short randomInteger(unsigned long n); //产生0--n-1之间的随机整数
    double randomFloat(void);                      //产生[0,1)之间的随机实数
};

RandomNumber::RandomNumber(unsigned long s)
{
    if (s == 0)
    {                            //用系统时间产生种子
        time_t tm = time(NULL);  //获取系统时间
        srand((unsigned int)tm); //用来设置rand()产生随机数时的随机种子
        randSeed = rand();       //产生一个随机数值
    }
    else
    { //由用户定义随机数值
        randSeed = s;
    }
}
/*
    产生0--n-1之间的随机整数,用线性同余计算的新种子高16位随机性好,将其右移16位
*/
unsigned short RandomNumber::randomInteger(unsigned long n)
{
    randSeed = multiplier * randSeed + adder;
    return (unsigned short)((randSeed >> 16) % n);
}
/*
    产生[0,1)之间的随机实数
*/
double RandomNumber::randomFloat(void)
{
    return randomInteger(maxshort) / double(maxshort);
}

int main()
{
    printf("\n************************\n请输入一个种子:");
    unsigned long rs;
    scanf("%ld", &rs);
    RandomNumber rn(rs);

    printf("\n请输入一个整数(确定随机数的范围):");
    int n;
    scanf("%d", &n);

    printf("\n\n************************\n产生0--%d之间的随机整数:%u \n", n - 1, rn.randomInteger(n));
    printf("\n产生[0,1)之间的随机实数为:%lf\n\n\n\n", rn.randomFloat());

    return 0;
}


运行结果为:
示例

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值