随机数生成算法(伪随机数)

什么是伪随机数,它和随机数的区别

伪随机就是一个过程看似随机的,但实际还不是随机的。伪随机数都是有一定的周期性的,如使用24小时里面的一个小时,这个就是伪随机数,或者三角函数的一个角度的三角函数值,因为时有周期性所以是伪随机的。

记住一点事要做到真正的随机有:抛硬币,热噪讯号、量子力学的效应、放射性元素的衰退辐射,或使用无法预测的现象等。

计算机里面的随机数主要还是用伪随机数来实现的,例如以当前时间作为种子。

伪随机数实现的算法

线性同余方法

它是根据递归公式:

其中是产生器设定的常数。

LCG的周期最大为,但大部分情况都会少于M。要令LCG达到最大周期,应符合以下条件:

  1. 互质
  2. 的所有质因子都能整除
  3. 是4的倍数也是;
  4. 都比小;
  5. 是正整数。

平方取中法

算法:

  1. 选择一个位数作为种子。
  2. 计算
  3. 不足个位,在前补0。在这个数选中间个位的数,即的数,将结果作为

M-sequence

M-sequence(Maximum
length sequence、MLS、最大长度串行)是在基本的通信电路设计中,所经常被利用到的一个虚拟随机数字信号《Pseudo
Random Sequence》,其主要的方式是利用第一位与其他位暂存器的输出值做ex-or来设计其第一位暂存器的输入值。

梅森旋转法

这个有点难有空再理解:维基百科的解答

内容主要来自维基百科,变成维基百科搬运工了:点击打开链接

随机数生成算法(伪随机数)

时间: 2024-12-28 13:32:10

随机数生成算法(伪随机数)的相关文章

随机数生成算法【详解,归纳】

1.蒙特卡洛方法 蒙特卡罗方法又称统计模拟法.随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法.将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解.为象征性地表明这一方法的概率统计特征,数学家冯·诺依曼用闻名世界的赌城——蒙特卡罗命名(就是那个冯·诺依曼). 蒙特卡罗方法解题过程的主要步骤: a.针对实际问题建立一个简单且便于实现的概率统计模型,使所求的量恰好是该模型的概率

随机数生成算法

1.蒙特卡洛方法 蒙特卡罗方法又称统计模拟法.随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法.将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解.为象征性地表明这一方法的概率统计特征,数学家冯·诺依曼用闻名世界的赌城--蒙特卡罗命名(就是那个冯·诺依曼). 蒙特卡罗方法解题过程的主要步骤: a.针对实际问题建立一个简单且便于实现的概率统计模型,使所求的量恰好是该模型的概率

加密算法与随机数生成算法

使用安全可靠的加密算法和随机数生成算法 密钥管理 在密码学里有个基本原则:密码系统的安全性应该依赖于密钥的复杂性,而不是算法的保密性. 在安全领域里,选择一个足够安全的加密算法不是困难的事,难的是密钥管理.在密钥管理中常见的错误是,将密钥硬编码在代码里.硬编码的密钥容易泄露: ① 代码被广泛传播(开源软件,商业软件的二进制文件,逆向工程反编译).安全方案:通过 Diffie-Hellman 交换密钥体系,生成公私密钥来完成密钥的分发. ② 软件开发团队的成员都能看到代码,从而获知密钥,如果人员流

正态分布的随机数生成算法

一.正态分布的随机数生成算法 前面介绍的都是均匀分布的随机数生成算法,在科学及工程应用中,正态分布的随机数也是经常用到的.对于一个给定的正态分布,描述该正态分布的参数包括均值μ和方差,在数学上,一种近似的产生正态分布的算法如下: Ri为[0,1]之间的均匀分布的随机数.当n趋向于无穷大时,得到的随机分布为正态分布.关于这个算法更为详细的数学讨论,读者可以参阅概率统计相关的书籍,这里将直接引用. 在实际应用中,不可能取n为无穷大.一般来说,n足够大就可以了.为了计算的方便,可以取n=12,这样上式

LCG(linear congruential generator): 一种简单的随机数生成算法

目录 LCG算法 python 实现 LCG算法 LCG(linear congruential generator)线性同余算法,是一个古老的产生随机数的算法.由以下参数组成: 参数 m a c X 性质 模数 乘数 加数 随机数 作用 取模 移位 偏移 作为结果 LCG算法是如下的一个递推公式,每下一个随机数是当前随机数向左移动 log2 a 位,加上一个 c,最后对 m 取余,使随机数限制在 0 ~ m-1 内 从该式可以看出,该算法由于构成简单,具有以下优点: 计算速度快 易于实现 易于

史上最全的java随机数生成算法[转载]

1 package com.zuidaima.core.util; 2 3 import java.util.Random; 4 5 public class RandomUtil { 6 public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 7 public static final String LETTERCHAR = "

LCG随机数生成算法

#include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc, char** argv) { int n = 300000000; double U; int random_num; srand(time(NULL)); //初始化随机数种子 for (int i = 0; i < 10; i++) { U = (double)rand() / RAND_MAX; //生成[0

伪随机数算法

Random 转载内容,有更改,感谢原作者() Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术的3.2.1节) 如果两个Random实例使用相同的种子,并且调用同样的函数,那么生成的sequence是相同的 也可以调用Math.random()生成随机数 Random实例是线程安全的,但是并发使用Random实例会影响效率,可以考虑使用ThreadLocal

Redis源码中看伪随机数生成算法

导读 --------------------------------------------------------------------------------------------------------------------------------------------------------------         Redis源码中有一个rand.c的源文件,很明显这是一个和(伪)随机数有关的文件.细看该文件代码只有寥寥50行,不过涉及到的算法原理却不简单,读起来虽然有些晦