基于线性同余法的伪随机数产生算法
- 格式:pdf
- 大小:1.00 MB
- 文档页数:6
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语言中常用的伪随机数生成算法包括线性同余发生器、梅森旋转算法和龙模算法等。
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++是一种非常强大且常用的编程语言,用于开发各种类型的应用程序。
在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`语句将生成的随机数作为结果返回。
通过以上步骤,我们就得到了一个简单的基于线性同余法的伪随机数生成器。
接下来,我们来讨论一些与这个算法相关的注意事项和改进方法。
首先,伪随机数生成算法是依赖于种子值的。
不同的种子值将产生不同的随机数序列。
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、伪随机数生成公式:
基于线性同余发,采用x=(ax+b) mod c计算方式,下一次的x值就是等于上一次计算结果。
其中a、b、c均为常数,这是一种非常简单的随机数生成方式。
但它只能产生有限的几种可能的随机数,不能满足某些应用场景的需要。
2、多项式函数生成公式:
多项式函数生成公式是一种多元多项式的形式,每次计算结果可以根据前几次计算的值,也就是前几次的随机数,再利用多项式函数,进行计算,从而产生最终的随机数。
3、混合随机数生成公式:
混合随机数生成公式是一种混合两种或多种随机数产生方式,以此来获得更好的随机数品质。
比如说,可以将伪随机数的产生过程和多项式函数的计算方式混合在一起,这样就可以产生更加好的随机数了。
4、梅森旋转算法:
梅森旋转算法是一种基于特殊函数构造的随机数生成方式,它
可以产生更加复杂的随机数,从而满足一些应用场景的需要。
总的来说,随机数的产生仍然是一个非常重要的研究领域,找到更加有效的方式,以便于计算机更加精准地产生随机数。
hutul随机数生成算法【原创版】目录1.Hutul 随机数生成算法简介2.Hutul 随机数生成算法的原理3.Hutul 随机数生成算法的实现4.Hutul 随机数生成算法的优缺点5.Hutul 随机数生成算法的应用案例正文【1.Hutul 随机数生成算法简介】Hutul 随机数生成算法是一种基于线性同余的伪随机数生成算法。
该算法由挪威程序员 Jens Hutul 于 2002 年提出,其主要特点是生成的随机数具有较好的统计特性,且在计算机上实现简单高效。
【2.Hutul 随机数生成算法的原理】Hutul 随机数生成算法基于线性同余原理,其核心思想是将一个整数序列映射到另一个整数序列,使得映射后的整数序列具有较好的随机性。
具体来说,算法通过取模运算将一个整数 n 映射到另一个整数 n",使得n"与 n 具有相同的随机性。
这种映射方式能够保证生成的随机数具有较好的统计特性。
【3.Hutul 随机数生成算法的实现】Hutul 随机数生成算法的实现相对简单。
首先,需要选择一个较大的质数 p 作为模数,以提高生成随机数的质量。
然后,根据线性同余原理,可以得到一个线性映射方程:n" = (n * a + c) % p,其中 n 是输入的整数,a 和 c 是常数,%表示取模运算。
根据这个方程,就可以实现随机数的生成。
【4.Hutul 随机数生成算法的优缺点】Hutul 随机数生成算法具有以下优点:1.生成的随机数具有较好的统计特性,如均匀分布、正态分布等;2.算法简单高效,易于实现和理解;3.对模数 p 的选择不敏感,较大的质数即可满足要求。
缺点:1.相对于其他伪随机数生成算法,如 Mersenne Twister 等,Hutul 算法的随机数生成速度较慢;2.在一些特殊情况下,生成的随机数序列可能存在周期性问题。
【5.Hutul 随机数生成算法的应用案例】Hutul 随机数生成算法广泛应用于各种需要生成随机数的场景,如蒙特卡洛模拟、加密算法、随机抽样等。
自己领悟把一.计算机中随机数的产生现在,在计算机,用来产生随机数的算法是“线性同余”法。
所谓线性同余,其实就是下面两个式子。
假设I就是一个随机数的序列,Ij+1与Ij的关系如下:Ij+1 =Ij * a+c (mod m)或是Ij+1 =Ij *a (mod m),其中,不妨取a=16807,m=2147483647,以为一常数。
写个简单的程序就是:long r;void scand( long v)//初始化随机种子数{r = v;}long rand()//产生随机数{r = (r*a + c)%m;//a,c,m为常数return r;}再看一下稍复杂一点的:(Random () 的Borland 的实现)long long RandSeed = #### ;unsigned long Random(long max){long long x ;double i ;unsigned long final ;x = 0xffffffff;x += 1 ;RandSeed *= ((long long)134775813);RandSeed += 1 ;RandSeed = RandSeed % x ;i = ((double)RandSeed) / (double)0xffffffff ;final = (long) (max * i) ;return (unsigned long)final;}二.计算机产生的随机数不是真的随机数[引:]我们建立了真正调用伪随机数生成器的random()。
但什么是伪随机数生成器?假定需要生成介于 1 和10 之间的随机数,每一个数出现的几率都是一样的。
理想情况下,应生成0 到 1 之间的一个值,不考虑以前值,这个范围中的每一个值出现的几率都是一样的,然后再将该值乘以10。
请注意,在0 和1 之间有无穷多个值,而计算机不能提供这样的精度。
为了编写代码来实现类似于前面提到的算法,常见情况下,伪随机数生成器生成0 到N 之间的一个整数,返回的整数再除以N。
伪随机数生成原理
伪随机数生成原理是指通过一定的算法和种子,生成看似随机的数字序列。
这种序列与真正的随机序列有所不同,因为它们是通过计算机程序生成的。
在实际应用中,伪随机数可以用于密码学、模拟、游戏等领域。
伪随机数生成算法通常包括线性同余法、梅森旋转算法、拉格朗日插值法等。
其中,线性同余法是最简单的算法,通过如下公式生成: X(n+1) = (a * X(n) + c) mod m
其中,a、c、m为常量,X(n)为上一个随机数种子,X(n+1)为新生成的随机数种子。
在实际应用中,伪随机数生成原理的安全性和随机性都受到极大的关注。
因此,需要严格控制种子值的生成和算法的选择,以确保生成的随机数序列不易被猜测和攻破。
同时,还需要对生成的随机数序列进行统计分析,以检验其随机性和分布情况。
总之,伪随机数生成原理是计算机科学中一个重要的概念,它涉及到许多领域的应用和研究。
在实际应用中,我们需要理解伪随机数生成原理的基本原理和技术,以便更好地应用和优化算法。
- 1 -。
mersennetwister梅森旋转算法梅森旋转算法(Mersenne Twister)是一种非常流行的伪随机数生成算法,由日本数学家松本Vigas的一种伪随机数发生器,其名称的由来是因为其周期长度是梅森素数时,最常用的版本是周期长为219937 - 1,也就是约等于10353的一个非常大的梅森素数。
它最初由松本和西明彦在1997年开发,被广泛用于计算机科学、统计学、金融学和其他领域的模拟和随机化中。
在现代计算机编程中,随机数生成是非常重要的一项工作,而梅森旋转算法无疑是其中最流行的之一。
下面我们将详细介绍梅森旋转算法的原理、应用和特点。
一、梅森旋转算法的原理梅森旋转算法是一种基于线性同余法的伪随机数生成算法,其核心原理是通过一个具有递归结构的线性同余方程来不断生成伪随机数序列。
具体而言,梅森旋转算法的核心方程如下:Xn+1 = (a*Xn + c) mod m其中Xn表示第n个随机数,a、c、m分别表示一组事先给定的参数,mod表示取模运算。
通过不断迭代这个方程,就可以生成一个伪随机数序列。
梅森旋转算法的优点在于其递归结构可以保证生成的随机数序列具有很长的周期,并且在统计上也具有较好的随机性。
二、梅森旋转算法的应用梅森旋转算法在计算机科学、统计学、金融学等领域有着广泛的应用。
在计算机科学中,随机数生成是很多算法和数据结构中的一个重要组成部分,梅森旋转算法可以用于生成仿真数据、密码学、游戏编程等领域。
在统计学中,很多统计模型的模拟和推断都需要用到随机数生成,梅森旋转算法可以帮助我们快速、高效地生成满足特定分布的随机数。
在金融学中,随机数生成也是非常重要的,梅森旋转算法可以用于模拟金融市场的波动和价格的随机变动。
三、梅森旋转算法的特点梅森旋转算法有着几个重要的特点。
首先,它具有很长的周期,这意味着在很长的时间内生成的随机数序列不会重复。
其次,它具有较好的统计性质,生成的随机数序列在一定程度上可以满足伪随机的要求。
随机数产生算法(一)伪随机数生成算法。
这个算法是最常用的啦。
它其实是按照一定的规则来生成数字的,但是这些数字看起来就像是随机的一样。
就好比你按照一个复杂的食谱做菜,每次做出来的菜看似不一样,但其实是按照固定步骤来的。
常见的伪随机数生成算法有线性同余法。
比如说,有一个简单的线性同余公式:X_n + 1=(aX_n + c) mod m。
这里面X_n是当前的随机数,a、c、m都是事先定好的常数。
通过不断地用这个公式计算,就能得到一系列看似随机的数字啦。
举个例子哈,假设a = 5,c = 3,m = 8,初始的X_0 = 1。
那第一次计算X_1=(5×1 + 3) mod 8 = 0,第二次计算X_2=(5×0 + 3) mod 8 = 3,这样一次次算下去,就能得到一串数字啦。
不过要注意哦,因为它是按照固定规则来的,所以如果知道了初始值和规则,那后面的数字其实是可以预测的,这就是为啥叫“伪随机”啦。
(二)真随机数生成算法。
真随机数生成算法就不一样啦,它生成的数字那是真的随机,没有任何规律可循。
一般是利用一些物理现象来产生随机数的。
比如说,利用放射性物质的衰变。
放射性物质的衰变是完全随机的,我们可以通过检测衰变的时间间隔或者其他相关信息,把这些信息转化成随机数。
再比如说,电路中的热噪声也是随机的,通过对热噪声进行采样和处理,也能得到真随机数。
像在一些对安全性要求特别高的地方,比如加密通信,就会用到真随机数,因为伪随机数有可能被破解嘛。
三、怎么用编程语言来实现随机数生成呢?不同的编程语言都有自己生成随机数的方法哦。
(一)Python语言。
在Python里,要生成随机数可以用`random`模块。
比如说,下面这段代码就能生成一个0到1之间的随机小数:python.import random.random_number = random.random().print(random_number).要是你想生成一个指定范围内的整数,比如说1到100之间的整数,那就可以用`randint`函数:python.import random.random_integer = random.randint(1, 100).print(random_integer).(二)Java语言。