线性同余法求伪随机数,Linear-Congruential: (a * x + c) % m, a > 0, m > 0, m % a < m / a.

首先,说明一下取随机数一般会用rand函数,取time.h文件中的clock()作为种子,产生我们需要的随机数

#include #include //srand()、rand()

#include //time();

int main() {

int n;

srand((unsigned)time(NULL)); //设置随机数种子

for (int i= 0; i< 10; i++) {

n = (rand() % 10) + 1 ;//产生1~10的随机数

//rand()产生的是一个很大的数,对其求余就可以达到限定范围的目的

printf("%d ", n);

}

return 0;

}

但是如果我们产生随机数种子的周期小于1s,那么就会产生一系列相同的随机数。总而言之,当产生随机数的周期非常非常小时,用已无法满足这一需求。因此,我们采用线性同余法,也就是较为简便的方法,那就是用现有的随机数种子来产生新的种子,也就是Linear-Congruential generator(线性同余数发生器)。

它是根据递归公式:

seed = (a*seed) mod m;

or

seed = (a*seed + c) mod m;这条公式需要满足:

a, m为正整数,m> a, m> seed;

它产生的随机数是以m为周期的,一般我们以2^32- 1为周期,a又不能取太大,所以为了避免取模溢出,

我们用一种方法解决:

Schrage’s Method Revealed算法,将公式形式变换,避免了溢出。

x = (a*x) mod m

= a*(x mod Q) - R*[xi/Q];

if (x > 0) result_seed = x;

else result_seed = x + m;具体实现:

random_my.h文件

namespace RAND_GEN {

class mod_my {

public:

long long m, a, c;

mod_my(long long _m, long long _a, long long _c) : m(_m), a(_a), c(_c) {}

// General case for x = (ax + c) mod m -- use Schrage's algorithm

// to avoid integer overflow.

// (ax + c) mod m can be rewritten as:

// a(x mod q) - r(x / q) if >= 0

// a(x mod q) - r(x / q) otherwise

// where: q = m / a , r = m mod a

//

// Preconditions: a > 0, m > 0.

//

// Note: only works correctly for m % a < m / a.

long long calc(long long x) {

if (a == 1) {

x %= m;

} else {

long long q = m / a;

long long r = m % a;

long long t1 = a * (x % q);

long long t2 = r * (x / q);

if (t1 >= t2) x = t1 - t2;

else x = m - t2 + t1;

}

if (c != 0) {

const long long d = m - x;

if (d > c) x += c;

else x = c - d;

}

return x;

}

};

class linear_congruential_engine_my {

public:

long long multiplier, increment, modulus;

unsigned long long default_seed_my, seed_my;

mod_my mod_temp;

linear_congruential_engine_my()

: multiplier(16807), increment(1), modulus(2147483647)

, default_seed_my(1u), mod_temp(modulus, multiplier, increment)

{ seed(default_seed_my); }

linear_congruential_engine_my(long long _m, long long _a,

long long _c, long long _s)

: multiplier(_a), increment(_c), modulus(_m)

, default_seed_my(_s), mod_temp(modulus, multiplier, increment)

{ seed(default_seed_my); }

void seed(unsigned long long s)

{ seed_my = s; }

long long min()

{ return increment == 0u ? 1u : 0u; }

long long max()

{ return modulus - 1u; }

void discard(unsigned long long z)

{ for (; z != 0ULL; --z) (*this)(); }

long long operator()() {

seed_my = mod_temp.calc(seed_my);

return seed_my;

}

};

}main.cpp

#include #include "random_my.h"

using namespace std;

using namespace RAND_GEN;

void test_calc() {

mod_my mod_1(9223372036854775807, 16807, 1);

if (mod_1.calc(9223372036854775) != 7443261233741790514 ||

mod_1.calc(922337203685477580) != 6456360425798331301 ||

mod_1.calc(9223372036852222220) != 9223371993936639099 ||

mod_1.calc(922337203685473330) != 6456360425726901551 ||

mod_1.calc(9223372022254775806) != 9223126654654759001)

cout << "Your calc() is wrong.\n";

else cout << "Pass all tests for calc().\n";

}

void test_engin() {

linear_congruential_engine_my lce;

int count = 1000;

int num[1001] = {0};

while (count--) num[lce()%5]++;

if (num[0] != 216 || num[1] != 190 ||

num[2] != 203 || num[3] != 216 ||

num[4] != 175) {

cout << "Your engin class is wrong in generator.\n";

return;

} else if (lce.min() != (lce.increment == 0u ? 1u : 0u)) {

cout << "Your engin class is wrong in min().\n";

return;

} else if (lce.max() != (lce.modulus - 1u)) {

cout << "Your engin class is wrong in max().\n";

return;

}

else cout << "Pass all tests for class engin.\n";

}

void hard_test() {

long long m, a, c, n, num[5] = {0};

unsigned long long s;

unsigned long long discard_n;

cin >> m >> a >> c >> s;

mod_my mod_1(m, a, c);

for (int i = 0; i < 5; i++) {

cin >> n;

cout << "(MOD CALC) ";

cout << n << ": " << mod_1.calc(n) << endl;

}

linear_congruential_engine_my lce(m, a, c, s);

cin >> discard_n;

lce.discard(discard_n);

cin >> n;

while (n--) num[lce()%5]++;

for (int i = 0; i < 5; i++) {

cout << "(ENGIN) ";

cout << i << ": " << num[i] << endl;

}

}

int main() {

int t;

cin >> t;

if (t == 0) {

test_calc();

test_engin();

} else {

hard_test();

}

return 0;

}

c语言同余法随机数,线性同余法取随机数相关推荐

  1. 乘积取中法matlab,迭代取中法、乘同余法及混合同余法产生随机数方法

    在用计算机编制程序时,经常需要用到随机数,尤其在仿真等领域,更对随机数的产生提出了较高的要求,仅仅使用 C 语言类库中的随机函数已难以胜任相应的工作.现实中,用投色子计数的方法产生真正的随机数,但电脑 ...

  2. 【随机数生成算法系列】线性同余法和梅森旋转法

    一般我们用到的随机算法都是伪随机算法,什么叫伪随机算法呢?伪随机算法意思是假如知道第一个随机种子和随机算法的话就可以推算出下一个随机数.通常我们程序里都是通过当前时间作为随机函数的第一个随机种子,然后 ...

  3. 随机算法求pi、线性同余法求random、拉斯维加斯算法python

    一.随机算法求pi # 计算圆周率 import pdb import random def CalcPai(n):# 计算π值k = 0for i in range(0,n):x = random. ...

  4. R语言螺旋线型线性不可分数据xgboost分类:使用xgboost模型来解决螺旋数据的分类问题、可视化模型预测的结果、添加超平面区域渲染并与原始数据标签进行对比分析

    R语言螺旋线型线性不可分数据xgboost分类:使用xgboost模型来解决螺旋数据的分类问题.可视化模型预测的结果.添加超平面区域渲染并与原始数据标签进行对比分析 目录

  5. c语言用随机数定义数组中,C语言 将发生的随机数存入数组,数据不能相同

    C语言 将产生的随机数存入数组,数据不能相同 1.定义一个一维数,数组大小为24. 2.产生0~23的随机数. 3.将产生的随机数存入i数组,要求数组中的每个数据不能相同. 4.补充说明,这个子程序要 ...

  6. 数据结构源码笔记(C语言):线性表的单链表示

    /* LinkList.c*/ /*线性表的单链表示:函数实现*/#include <stdio.h> #include <stdlib.h> //#include " ...

  7. 数据结构源码笔记(C语言):线性表的顺序表示

    /* SeqList.c*/ /*线性表的顺序表示:函数实现*/#include <stdio.h> #include <stdlib.h> //#include " ...

  8. c语言怎么输出线性表里元素,C语言的世界-线性表

    原标题:C语言的世界-线性表 点击在看 关注我们 C语言的世界-线性表 线性表介绍 2020/5/5 了解线性表 线性表是最基本.最简单.也是最常用的一种数据结构.线性表(linear list)是数 ...

  9. c语言中有关随机数的程序,C语言中随机数相关问题

    用C语言产生随机数重要用到rand函数.srand函数.及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明. int rand(void);//生成一个随机数 voidsrand ...

  10. R语言与多元线性回归方程及各种检验

    R语言与多元线性回归方程及各种检验 文章目录 R语言与多元线性回归方程及各种检验 一.模型建立 二.多重共线性 (1)产生的背景: (2)多重共线性的检验 1.简单相关系数法: 2.方差膨胀因子(vi ...

最新文章

  1. c语言实验报告世界时钟,基于LCD的电子时钟实验报告.doc
  2. c语言1余3,c语言1—3真题(含答案).ppt
  3. Objective C 链式调用
  4. redis性能测试报告
  5. 修改thymeleaf默认路径
  6. 读文件并返回其中最大最小行的shell脚本
  7. 【转贴】PLSQL不安装客户端连接远程oracle
  8. 比特(bit)和字节(byte)(1byte=8bit)
  9. 在WildFly上将JPA和CDI Bean与骆驼一起使用
  10. python亿级mysql数据库导出_Python之csv文件从MySQL数据库导入导出的方法
  11. CSS3实现button:hover时background-color从左慢慢移动到右边
  12. 解决gridview导出到excel中汉字出现乱码的问题
  13. 谷歌云端语音识别软件
  14. MFC 获取窗口句柄
  15. 无线网破解 跑字典 EWSA使用教程
  16. Java-获取本地主机的域名和主机名(net)
  17. 应用安全系列之二十九:密码管理
  18. mybatis一个怪异的问题: Invalid bound statement not found 作者及来源: babyblue - 博客园 收藏到→_→: 摘要: mybatis一个怪异
  19. python赋值和控制语句_Python流程控制语句
  20. 超过3万Mac已感染 “银麻雀”病毒 最新m1芯片也中招

热门文章

  1. css面试题之Flex布局
  2. 最有效的Safari的广告拦截插件
  3. python爬虫爬当当网_python爬取当当网图书排行榜
  4. 批量自动付款(京东)
  5. 如何利用用户ID号、关键词或视频时长在自媒体视频软件上批量采集下载关于在自媒体视频软件上批量采集...
  6. Linux C/C++UDP通信实现
  7. X5Webview TbsReaderView背景色修改
  8. 使用python玩转dicom文件——医学图像处理工具pydicom入门教程
  9. linux 打包大文件,tar打包处理大文件的解压缩方法
  10. JVM 字节码指令手册 - 查看 Java 字节码