线性同余发生器-随机数

简介

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

线性同余发生器的示例

// random_number.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.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 Random(unsigned long n);//产生0--n-1之间的随机整数
    double fRandom(void);//产生[0,1)之间的随机实数
};

RandomNumber::RandomNumber(unsigned long s)
{
    if (s == 0)
        randSeed = time_t(0);//用系统时间产生种子
    else
    {
        randSeed = s;//由用户提供种子
    }
}
/*
    产生0--n-1之间的随机整数,用线性同余计算的新种子高16位随机性好,将其右移16位
*/
unsigned short RandomNumber::Random(unsigned long n)
{
    randSeed = multiplier*randSeed + adder;
    return (unsigned short)((randSeed >> 16) % n);
}
/*
    产生[0,1)之间的随机实数
*/
double RandomNumber::fRandom(void)
{
    return Random(maxshort) / double(maxshort);
}

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

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

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

    return 0;
}

线性同余发生器-随机数_第1张图片

你可能感兴趣的:(C++,算法思想)