基于线性同余法的伪随机数产生算法


运用计算机仿真解决实际问题时,首先要研 究随机数的产生方法,或者称为随机变量的抽样 方法。真正意义上的随机数在某次产生过程中是 按照实验过程中表现的分布概率随机产生的,结 果是不可预测、不可见的[1]。在(0,1)区间均 匀分布随机数 IIDU(0,1)是最基本的随机数, 通过对 IIDU(0,1)的适当变换,可以得到任意 分布的其他随机变量。随机数产生有很长的历史, 最早是采用掷骰子、抽签、摇号、在盒子里取带 有标号的球等方法,现在的彩票、分房等领域, 这些手工方法还广泛使用。但是手工方法无法满 足仿真计算时对大量随机数的需要,因此需要用 计算机来产生随机数。
利用某种方法得到一序列 y1,y2,…,yn,在一定 意义下可作为随机样本 x1,x2,…,xn 的一组样本值, 称 y1,y2,…,yn 是一组具有与 X 相同分布的随 机序列。
运用数学方法产生伪随机序列通常采用递推
公式的方式:
xn=f ( xn-1,xn-2,xn-k )
(1)
产生序列 x1,x2,…,xn,…,当 n 充分大时,
随机序列不是一个数,是一个序列,而随机
数是某个随机序列中的一个。随机数的随机性只
能在随机序列中体现。
设随机变量 X(总体)服从某种随机分布,
对其进行 n 次独立实验,得到一组简单随机样本
序列 x1,x2,…,xn,满足: (1)x1,x2,…,xn 相互独立; (2)每一个 x1,x2,…,xn 都与总体 X 同分布。
1 伪随机数产生算法提出
由于伪随机数是用算法产生的,除受算法本
身的影响外,还受计算机字长及内存等方面的限
制。因此,无论多么优秀的算法,在统计特征上
都不可能完全与从均匀分布中抽样所得的随机数
相同,只是尽可能地近似。对应随机数要求具有
随机性、均匀性、重现性、速度快、独立性、占 用内存空间少、不重复性等要求[8-10]。
第 25 卷第 3 期 2018 年 9 月
辽东学院学报(自然科学版) Journal of Eastern Liaoning University (Natural Science Edition)
Vol. 25 No.3 Sept. 2018
【信息科学与工程】
DOl:10. 14168 / j.issn.1673 - 4939.2018.03.0 3
(1. 辽东学院 信息工程学院,辽宁 丹东 118003;2. 辽东学院 服装与纺织学院,辽宁 丹东 118003; 3. 锦州农村商业银行,辽宁 锦州 121000)
摘 要:随机数产生是计算机仿真领域重要的研究方向。针对物理方法产生随机数具有无法重现、 费用较高等缺点,文章基于线性同余法研究伪随机数产生。首先,分析了伪随机数产生算法的要求,包 括有随机性、均匀性、重现性、速度快、独立性等;然后,研究伪随机数产生算法,包括伪随机序列定义、 线性同余法的概念及性质、线性同余法的解法引理、线性同余发生器产生伪随机数;最后,为了计算机 编程实现,研究产生伪随机数算法程序流程。文章研究内容产生的伪随机数,具有产生速度快、输出序 列周期长等特点,是一种理想的伪随机数产生算法。 关键词:线性同余法;伪随机数;伪随机序列;产生算法;计算机仿真 中图分类号:TP301.6 文献标志码:A 文章编号:1673-4939(2018)03-0201-06
因此无法重复计算,无法实现不改变随机序列的 重复仿真。只有采用将随机数保存到文件的方式, 这样做的缺点是占用存储空间且影响计算速度; 二是产生费用较高。需要在计算机中安装随机数 发生器和电路联接设备,成本较高且不容易获得。
目前大多数仿真都是采用计算机程序来产生 IIDU(0,1)均匀分布随机数,即采用某种确定 的规则,通过递推计算产生数序列。虽然不是真 正的随机数,但具有真正随机数的统计性质,因 此可以当作真正随机数使用。这样的数列称为伪 随机数。所谓“伪”并不是说产生了一个假的随 机数或随机数序列,而是指随机数是由一个已知 的算法产生。伪随机数产生是计算机仿真的基础 性工作,本文运用线性同余法研究伪随机数产生 算法,为计算机仿真提供服务。线性同余算法作 为使用最为广泛的伪随机数产生算法,具有产生 速度快、输出序列周期长等特点[4-5],但是产生 随机数性能依赖于算法所用的时间,所用时间越 多,得到随机数的质量也就越高。
数列具有均匀分布随机变量独立抽样序列的性质,
这一数列就称为伪随机序列。伪随机序列又有狭
义伪随机序列和广义伪随机序列之分。
如果随机误差项的各期望值之间存在着相
关关系,这时,称随机误差项之间存在自相关性
(autocorrelation)或序列相关。
凡自相关函数满足下式:
1
R
x
(
j
)
真正的(0,1)均匀分布随机数可采用物理 方式产生,即在计算机中附加某些物理设备,如 电子噪音发生器、放射源激励计算机等,把具有 随机性质的物理过程转变为随机数,这样产生的 随机数称为真随机数。这种产生随机数的方法存 在两方面弊端[2-3],一是随机数无法重现,无法 对结果进行检查。因为随机过程具有不可重复性,
线性同余发生器可以在一维空间中产生较好
收稿日期:2017-11-06 作者简介:张大伟(1978—),男,山东荣成人, 硕士,讲师,研究方向:计算机应用技术。
·201·
辽东学院学报(自然科学版)
第 25 卷
的随机数,用线性同余法产生均匀随机数相关性 弱到一定程度就可以认为是相互独立的。但传统 的线性同余发生器周期有限,不能够应用于复杂 系统的仿真,而通过将两个或者更多个线性同余 发生器组合而成的混合同余发生器将会有更长的 周期和更好的统计性质。参照已有研究成果[6-7], 本文的研究主要体现在两个方面:一是,构造了 线性同余发生器产生伪随机数的数学模型,提出 了根据参数选择确定伪随机序列的均匀性、独立 性和循环周期的方法;二是,设计了基于 DSP 芯 片的伪随机数产生流程,系统仿真人员可以根据 此流程直接编写程序,提高了仿真工作效率。
合集下载

S7200PLC产生一个随机数的方法

S7200PLC产生一个随机数的方法

S7200 PLC产生一个随机数的方法伪随机数的产生,现在用得较多的是“线性同余法"就是下面这个式子R(n+1) = [R(n) * a + b] mod c为使随机数分布尽量均匀,a、b 均为质数, c 一般取值域内的最大值(mod 是求余数)从这个式了可以看出,每次产生的随机数都跟上一次产生的数有关系,那么,第一个数是怎么来的呢?这就是线性同余法中必须用的的”种子",也就是说,给定某个种子后,所产生的随机数序列是固定的,在计算机编程中,一般使用系统时间来初始化种子,就是前面代码中的srand((unsigned)time(NULL)); 这一句了。

因为每次运行程序的时间肯定不一样,所以产生散列肯定也不一样,从而达到“随机”的目的。

a,b,c 的取值我用的是a=3373, b=1, c=32768下面的两个子程序是我在我的项目(S7-200 226)中产生随机的系统编号用的,因为我的编号中只有4位数采用了随机数,所以下面的程序中用的是整型,最大范围为32767。

如果需要更宽范围的随机数,可以采用双字类型,并适当修改程序,代码很简单,就是将上面那个表达式用S7-200 的指令表示出来就行了。

这两个子程序是从MicroWIN V4.0 中导出来的,可以将它们用文本编辑器保存为A WL 文件后直接导入MicroWIN。

使用时在第一个扫描周期调用Srand初始种子,需要随机数的地方调用RandomRandom 有了个最大范围参数,可以限制生成的随机数的最大范围,比如我只需要4位随机数,所以一般这样调用CALL Random, 10000, vw0,生成的数就在0-9999 范围内下面是代码:SUBROUTINE_BLOCK Srand:SBR17TITLE=初始化随机数种子//// 直接使用系统时钟的分秒来作为种子V AR_OUTPUTseed:WORD;END_V ARBEGINNetwork 1LD SM0.0TODR VB1990Network 2LD SM0.0BTI VB1994, AC1SLW AC1, 8BTI VB1995, AC3+I AC3, AC1MOVW AC1, LW0END_SUBROUTINE_BLOCKSUBROUTINE_BLOCK Random:SBR16TITLE=随机数发生器//// 线性同余法获取伪随机数,范围:0~32767 //// seed = (seed * 3373 + 1) % 32768;//V AR_INPUTwMax:WORD; // 最大范围END_V ARV AR_OUTPUTwOut:WORD;END_V ARBEGINNetwork 1// wSeed * 3373 + 1 => AC1LD SM0.0ITD VW1940, AC1*D 3373, AC1INCD AC1Network 2// AC1 mod 32768 => wSeedLD SM0.0MOVD AC1, AC3/D +32768, AC3*D 32768, AC3-D AC3, AC1DTI AC1, VW1940Network 3// wSeed / 32768 * wMax => wOutLD SM0.0DTR AC1, AC1/R 32768.0, AC1ITD LW0, AC3DTR AC3, AC3*R AC3, AC1ROUND AC1, AC1DTI AC1, LW2END_SUBROUTINE_BLOCK。

一种基于线性同余算法的伪随机数产生器

一种基于线性同余算法的伪随机数产生器

一种基于线性同余算法的伪随机数产生器
马华;张晓清;张鹏鸽
【期刊名称】《纯粹数学与应用数学》
【年(卷),期】2005(021)003
【摘要】线性同余算法作为使用最为广泛的伪随机数产生算法,具有产生速度快、输出序列周期长等特点,但安全性能不佳的弱点始终制约着该算法在密码学领域的应用.本文在对线性同余算法详细分析的基础上,给出了一种不受乘数a选择限制的伪随机数产生器.该算法具有良好的伪随机性和安全性.
【总页数】4页(P206-209)
【作者】马华;张晓清;张鹏鸽
【作者单位】西安电子科技大学理学院,西安,710071;西安电子科技大学理学院,西安,710071;西安电子科技大学理学院,西安,710071
【正文语种】中文
【中图分类】TN918.2
【相关文献】
1.一种基于伪随机数调制的混合域盲水印算法 [J], 王志伟;龚晓静;韩绍程
2.基于蔡氏电路混沌系统的伪随机数产生器 [J], 陆骥;周莉
3.一种基于分数阶微积分的分数阶伪随机数字水印新算法 [J], 邓英
4.基于CUDA平台的伪随机数产生器系统研究 [J], 郭海凤
5.基于线性同余法的伪随机数产生算法 [J], 张大伟;邵英海;左垒
因版权原因,仅展示原文概要,查看原文内容请购买。

c语言伪随机数生成算法

c语言伪随机数生成算法

c语言伪随机数生成算法C语言中常用的伪随机数生成算法包括线性同余发生器、梅森旋转算法和龙模算法等。

1. 线性同余法:线性同余发生器是一种基于线性递归的伪随机数生成器。

其算法基本原理是将当前数值与一个常数a相乘再加上一个常数c,再对m取模,得到下一个数值。

具体伪代码如下:seed = 设置初始种子a = 设置常数ac = 设置常数cm = 设置常数mnext = (seed * a + c) % mseed = next2. 梅森旋转算法:梅森旋转算法是一种基于循环移位的伪随机数生成算法,它利用梅森素数进行计算。

具体伪代码如下:state = 种子数W = 计算梅森素数function generateRandomNumber():if state < W:state = 计算下一个数else:state = 计算下一个数return state3. 龙模算法:龙模算法是一种结合线性同余发生器和移位发生器的伪随机数生成算法。

具体伪代码如下:state = 初始种子a = 设置常数ac = 设置常数cm = 设置常数mw = 设置常数wfunction generateRandomNumber():state = (state * a + c) % mrandomBits = state >> wstate = ((state & 0xFFFFFFFF) << (32-w)) randomBitsreturn randomBits需要注意的是,这些算法都是伪随机数生成算法,因为它们的结果是通过确定性的计算得到的,并不是真正的随机数。

伪随机数生成器的算法

伪随机数生成器的算法

伪随机数生成器的算法
伪随机数生成器的算法是计算机科学领域中的一个重要概念。

它是用来模拟随机性的工具,能够在程序设计和数据分析中起到关键作用。

虽然它们被称为“伪随机”,但它们仍然被广泛应用并且具有很高的可靠性。

伪随机数生成器的算法主要分为线性同余方法、梅森旋转方法、拉斐特方法等。

其中,线性同余方法是最常见的一种算法。

它通过一个线性递推公式来生成伪随机数,公式的参数包括种子值、模数、乘数和增量。

通过不断迭代计算,就可以生成一系列的伪随机数。

梅森旋转方法则是一种更加复杂的算法,它利用了位运算和异或运算来生成伪随机数,具有更好的随机性和周期性。

伪随机数生成器的算法在实际应用中有着广泛的用途。

在计算机图形学中,它们被用来生成虚拟世界中的随机纹理和噪声。

在密码学中,它们被用来生成加密密钥和初始化向量。

在模拟实验和统计分析中,它们被用来生成随机样本和模拟随机事件。

总之,伪随机数生成器的算法在计算机科学的各个领域都发挥着重要作用。

然而,尽管伪随机数生成器的算法被广泛应用,但它们并不是完美的。

在一些特定的应用场景下,它们可能会出现周期性和相关性的问题,导致生成的伪随机数不够随机。

为了解决这些问题,研究人员不断提出新的算法和改进方案,以提高伪随机数生成器的质量和性能。

总的来说,伪随机数生成器的算法是计算机科学领域中一个重要且不断发展的领域。

它们为计算机程序和数据分析提供了可靠的随机性模拟工具,同时也带来了一些挑战和问题。

随着技术的不断进步和研究的深入,我们相信伪随机数生成器的算法将会变得更加完善和可靠。

c++ 6位唯一随机数 算法

c++ 6位唯一随机数 算法

c++ 6位唯一随机数算法C++是一种非常强大且常用的编程语言,用于开发各种类型的应用程序。

在C++中,生成唯一的6位随机数是一个常见的需求。

本文将介绍几种算法,以帮助你生成唯一的6位随机数。

1.线性同余法(Linear Congruential Generator,简称LCG)线性同余法是一种简单而广泛使用的伪随机数生成算法。

它的公式为:X(n+1) = (a * X(n) + c) mod m,其中a、c和m是常量,X(n)是前一个随机数。

这种算法的随机数循环周期是m,所以我们可以设置m为1000000,生成0到999999之间的随机数。

下面是一个示例代码:```cpp#include <iostream>#include <cstdlib>int main() {int a = 1103515245; //常量aint c = 12345; //常量cint m = 1000000; //常量mint seed = time(NULL); //以当前时间为种子for (int i = 0; i < 6; i++) {seed = (a * seed + c) % m;std::cout << seed << " ";}return 0;}```这段代码使用了time(NULL)函数作为种子,确保每次运行都会生成不同的随机数序列。

2. Fisher-Yates洗牌算法Fisher-Yates算法是一种用于生成随机排列的算法。

它的思想是从数组的最后一个元素开始,将它与数组中的一个随机位置的元素交换,并逐渐向前遍历数组进行交换,直到第一个元素。

下面是一个示例代码:```cpp#include <iostream>#include <cstdlib>#include <ctime>void shuffle(int arr[], int n) {srand((unsigned)time(NULL));for (int i = n - 1; i > 0; i--) {int j = rand() % (i + 1);std::swap(arr[i], arr[j]);}}int main() {int arr[1000000];for (int i = 0; i < 1000000; i++) {arr[i] = i;}shuffle(arr, 1000000);for (int i = 0; i < 6; i++) {std::cout << arr[i] << " ";}return 0;}```这段代码首先生成一个包含0到999999的数组,然后使用shuffle函数将数组随机洗牌。

伪随机数生成算法代码 -回复

伪随机数生成算法代码 -回复

伪随机数生成算法代码-回复【伪随机数生成算法代码】伪随机数生成算法是一种通过既定的算法和种子值来模拟真随机数序列的生成过程。

它在计算机科学和统计学等领域中广泛应用,并被用于模拟、密码学、随机化算法等领域。

以下是一个基于线性同余法的伪随机数生成算法代码:pythonseed = 0 初始化种子值def pseudo_random():global seeda = 22695477 乘数m = 232 模数c = 1 增量seed = (a * seed + c) m 更新种子值return seed生成随机数序列示例for _ in range(10):print(pseudo_random())在上述代码中,`seed`代表种子值,是一个存储当前随机数状态的变量。

`pseudo_random`函数是主要的伪随机数生成器,它基于线性同余法计算生成随机数。

其中,`a`、`m`和`c`是预先定义的常数,用于控制随机数生成的产生规则。

下面,我们将逐步解析这个伪随机数生成算法的工作原理。

1. 初始化种子值:`seed = 0`。

由于随机数生成需要一个初始值作为起点,我们选择0作为种子值。

2. 定义常数:`a`、`m`和`c`。

`a`是乘法的乘数,`m`是模数,`c`是增量。

这些常数的选择是根据具体需求和算法特性进行调整的。

3. 生成随机数:伪随机数生成器的核心逻辑是`seed = (a * seed + c) m`。

它通过不断地更新种子值,生成下一个随机数。

乘法和加法是线性同余法的两个要素,``运算符是用来确保生成的数范围在0到`m-1`之间。

4. 返回随机数:`return seed`语句将生成的随机数作为结果返回。

通过以上步骤,我们就得到了一个简单的基于线性同余法的伪随机数生成器。

接下来,我们来讨论一些与这个算法相关的注意事项和改进方法。

首先,伪随机数生成算法是依赖于种子值的。

不同的种子值将产生不同的随机数序列。

西门子S7 -300线性同余法产生随机数

Seed :DINT ; random:DINT ; END_VAR VAR_OUTPUT randSeed :real; END_VAR random:=(Seed* 25173 +13849 ) MOD 65536; Seed:= random; randSeed:=random**1.0/65536.0; END_FUNCTION
B,M互质; M的所有质因数都能整除A-1; 若M是4的倍数,A-1也是; A,B,N[0]都比M小; A,B是正整数。
2. A,B,M的选取
A,B,M 的取值我用的是A=25173, b=13849, M=65536
FUNCTION FC900 : VOID VAR_TEMP END_VAR VAR_IN_OUT
西门子S7 -300线性同余法产生随机数
1. 线性同余法(LCG)
线性同余方法是一种产生伪随机数的方法
递归公式: RandSeed = (A * RandSeed + B) % M A:乘数 B: 增量 M:模数 LCG的周期最大为 M,但大部分情况都会少于M。
要令LCG达到最大周期,应符合以下条件:
4. 程序运行后产生0-1之间的随机数
3. 种子选取
根据公式每次产生的随机数都跟上一次间秒做种子
在第一个扫描周期调用初始种子。
CALL "READ_CLK" RET_VAL:=#ret CDT :=#sys_time
LAR1 P##sys_time L B [AR1,P#5.0] BTI T "种子"

在VC++中生成伪随机数祥解

程序段 1 中由于将 srand() 函数放在循环体内,而程序执行的 CPU 时间较快,调用 time 函数获取的时间精度却较低(55ms),这样循环体内每次产生随机数用到的种子数都是一样 的,因此产生的随机数也是一样的。而程序段 2 中第 1 次产生的随机数要用到随机种子,以 后的每次产生随机数都是利用递推关系得到的。
在 VC++中生成伪随机数祥解
摘要 伪随机数在计算机软件设计中有很广泛的用途。本文介绍了基于数学方法的利用计算机 产生伪随机数的一种方法,即线性同余法,任何伪随机数的产生都是运用递推的原理来生成 的。以及在 Visual C++环境中产生伪随机数的两个重要函数,rand 和 srand 函数,正确地使 用这两个函数是产生性能良好的伪随机数的关键,最后介绍了利用伪随机数生成技术在 MFC 中生成基于 C/S 模式应用程序的随机校验码以及利用一种软件工具 ImagePassword 产 生随机密码。
运行结果如图 1 所示:
程序运行时,由于每一次点击"产生随机校验码"的系统时间不同,生成随机数的种子就不一 样,因此产生的随机数也是不一样的,从而保证了校验码生成的随机性。
利用 ImagePassword 工具产生随机密码 ImagePassword 提供一个可选择的图形阵列,通过随机改变图形阵列中的阵点图形来 产生随机密码。当随机点击图象阵列中的图象阵点,该阵点中的图象发生变化。其运行界面 如图 2 所示:
应用递推公式产生均匀分布随机数时,式中参数 n0,a,b,M 的选取十分重要。 例如,选取 M=10,a=b =n0=7,生成的随机序列为{6,9,0,7,6,9,……},周期为 4。 取 M=16,a=5,b =3,n0=7,生成的随机序列为{6,1,8,11,10,5,12,15,14,9, 0,3,2,13,4,7,6,1……},周期为 16。 取 M=8,a=5,b =1,n0=1,生成的随机序列为{6,7,4,5,2,3,0,1,6,7……}, 周期为 8。

mt19937原理

mt19937原理
MT19937是一种伪随机数生成器算法,它是由Makoto Matsumoto 和Takuji Nishimura于1997年发明的。

该算法基于线性同余法,具有周期长达2^19937-1,可以生成高质量的随机数序列。

MT19937算法的原理主要包括种子生成和随机数生成两个部分。

种子生成使用系统时间或其他随机源作为种子,通过一系列的置换和混淆操作,生成状态数组。

随机数生成则利用状态数组中的值,根据一定的算法生成随机数序列。

MT19937算法的优点在于生成随机数的速度快,具有优良的统计特性和均匀分布性。

但是,MT19937算法的种子长度为32位,在存在预测攻击的情况下,其随机数序列可能会被暴力破解。

因此,在加密和安全领域,MT19937算法通常不被用作真随机数生成器。

- 1 -。

两种常见的伪随机数算法

两种常见的伪随机数算法伪随机数是计算机生成的一系列看似随机的数字序列。

虽然伪随机数并不是真正的随机数,但它们的使用仍然非常广泛,并且在计算机科学和密码学等领域都有重要的应用。

在本文中,我将介绍两种常见的伪随机数算法:线性同余生成器和梅森旋转算法。

1. 线性同余生成器(Linear Congruential Generator,LCG):线性同余生成器是一种简单的伪随机数生成器,它的计算公式为:X_{n+1} = (a * X_n + c) mod m其中,X_n是当前伪随机数,X_{n+1}是下一个伪随机数,a、c和m是预先设定的常数。

LCG算法的优点是简单易实现,并且具有较好的随机性。

通过选择合适的参数值,它可以产生高质量的伪随机数。

然而,LCG算法也有一些缺点。

当参数选择不当时,会导致周期较短或重复出现相同的伪随机数序列。

此外,在密码学等关键领域中,LCG算法的安全性较低,易受到攻击。

2. 梅森旋转算法(Mersenne Twister):梅森旋转算法通过一个大型的位向量来保存当前状态,并通过一系列数学计算来生成下一个伪随机数。

为了提高性能,它使用了位操作和快速模运算等技术。

梅森旋转算法在实践中表现出色,具有较好的均匀性、分布特性和随机性。

目前,它广泛应用于计算机图形学、模拟与建模、游戏开发和密码学等领域。

总结:线性同余生成器和梅森旋转算法是两种常见的伪随机数生成算法。

线性同余生成器简单易实现,但有一定的局限性。

梅森旋转算法复杂、高效,并具有优秀的随机性能。

在选择伪随机数算法时,应根据具体应用需求和安全性要求进行评估和选择。

同时,为了增加随机性,可以采用多种算法的组合或使用更复杂的算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档