首页 > 编程语言 >伪随机数算法

伪随机数算法

时间:2023-09-14 23:34:32浏览次数:36  
标签:同余法 产生 序列 算法 随机数 线性

伪随机数算法(一)

  伪随机数概念在我大学一年级接触C语言基础的时候就听说过,并熟练掌握C语言中rand()函数的使用方法。不过,当时我对伪随机数的认识基本也就停留在百度百科那种小白水平,最多就知道老师说我们用的随机数是假的,是通过某种算法实现的。最近学习计算物理学讲到Monte Carlo方法时,通过课本和互联网才算真正意义上理解了什么是伪随机数。借此文好好总结一下吧!

 

一、随机数的分类

  在计算物理学中,随机数被准确地分成了三类:真随机数、准随机数、伪随机数。那么这三种的区别是什么呢?拷贝一段书上的定义(我觉得写的挺好的⊙﹏⊙,其实是懒得想别的表述方式):

  1)真随机数:产生的数不可预计,也不可能重复产生两个相同的真随机数序列。真随机数只能通过某些随机的物理过程来产生,如放射性衰变、电子设备的热噪声等。

  2)准随机数:其随机数序列不具备随机性质,仅仅是用它来处理问题能够得到正确的结果。(老实说,准随机数我目前也没准确理解,读者有好的例子请@我)

  3)伪随机数:通过某种数学公式或者算法产生的数值序列。虽然在数学意义上伪随机数是不随机的,但是如果能够通过统计检验,可以当成真随机数使用。

 

二、伪随机数算法

  伪随机数产生的方法有个逼格挺高的名字---伪随机数发生器。伪随机数产生器中最最最基础的思想是均匀分布(当然这不是唯一的思路)。一般来说,只敢说"一般来说",因为我也不敢百分百肯定,如今主流的编程语言中使用的随机数函数基本采用这种均匀分布思想,而其中最常用的算法就是"线性同余法"(有着很多的别名,不过我喜欢用这个名字,原因你懂的→_→)。不BB别的算法,直接介绍线性同余法。

  1. 什么是线性同余法?

  对于计算机科学专业的学生来说,八成会接触一门课,叫作《离散数学》。里面有一章专门介绍初等数论,而线性同余法作为产生均匀型伪随机数的算法,有大概一页的论述(真是一个悲剧(-_-メ))。当然,可能很多人在初中或者之后的数学竞赛中学过初等数论,线性同余法当然也一定是有过接触的。

  线性同余法基于如下线性同余方程组

 

伪随机数算法_随机数

  用于产生均匀型伪随机数的线性同余产生器(与上面的方程符号没有对应关系)

                                             

伪随机数算法_随机数序列_02

 

  其中,a为"乘数",b为"增量",m为"模数",x0为"种子数"。

  如果产生的是区间实在(0,1)之间的,则只需要每个数都除以m即可,即取

 

伪随机数算法_Java_03

  2. 线性同余法产生均匀型伪随机数需要注意什么?

   2.1)种子数是在计算时随机给出的。比如C语言中用srand(time(NULL))函数进行随机数种子初始化。

     2.2)决定伪随机数质量的是其余的三个参数,即a,b,m决定生成伪随机数的质量(质量指的是伪随机数序列的周期性)

     2.3)一般b不为0。如果b为零,线性同余法变成了乘同余法,也是最常用的均匀型伪随机数发生器。

  3. 高性能线性同余法参数取值要求?

   3.1)一般选取方法:乘数a满足a=4p+1;增量b满足b=2q+1。其中p,q为正整数。 PS:不要问我为什么,我只是搬运工,没有深入研究过这个问题。

     3.2)m值得话最好是选择大的,因为m值直接影响伪随机数序列的周期长短。记得Java中是取得32位2进制数吧。

     3.3)a和b的值越大,产生的伪随机数越均匀

   3.4)a和m如果互质,产生随机数效果比不互质好。

 

三、伪随机数代码实现

  本文采用Java代码实现伪随机数算法(当然不是调用Java库函数,也不是抄它的代码)。产生序列的均匀性可以通过Matlab或者导入Excel作图直观检验。

伪随机数算法_随机数序列_04

1 package monteCarlo;
 2 
 3 public class MonteCarlo {
 4     private static final int MAXN = 1 << 20;
 5     private int[] x;
 6     
 7     public MonteCarlo() {
 8         x = new int[MAXN];
 9     }
10     
11     public void rand() {
12         x[0] = (int)(Math.random()*100 + 1);  // 随机种子(可以用日期产生)
13         /* 保证m与a互质 */
14         int m = MAXN;  
15         int a = 9;  // a = 4p + 1
16         int b = 7;  // b = 2q + 1
17 
18         System.out.println(x[0]);
19         /* 取前1w个数*/
20         for(int i = 1; i < 10000; ++i) {
21             x[i] = ( a * x[i-1] + b ) % m;
22             System.out.println(x[i]);
23         }    
24     }
25     
26     public static void main(String[] args) {
27         MonteCarlo mc = new MonteCarlo();
28         mc.rand();
29     }
30 }

伪随机数算法_Java_05

标签:同余法,产生,序列,算法,随机数,线性
From: https://blog.51cto.com/u_16078663/7475257

相关文章

  • 深入了解归并排序算法
    归并排序(MergeSort)是一种高效的、基于分治法的排序算法,它的稳定性和性能使其成为常用的排序方法之一。本文将详细介绍归并排序的工作原理,提供示例和Python、Go、Java以及C语言的实现代码。归并排序的基本思想归并排序的核心思想是将数组分成两个子数组,递归地对这两个子数组进行排......
  • 算法戴高乐计划-01篇
    LCP07.传递信息小朋友A在和ta的小伙伴们玩传信息游戏,游戏规则如下:有n名玩家,所有玩家编号分别为0~n-1,其中小朋友A的编号为0每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如A可以向B传信息,但B不能向A传信息)。每轮信息必......
  • 代码随想录算法训练营第八天
    代码随想录算法训练营第八天|LeetCode28(实现strStr())LeetCode459(重复的子字符串)28:实现strStr()LeetCode28(实现strStr())classSolution{publicintstrStr(Stringhaystack,Stringneedle){//构造next数组int[]next=newint[needle.l......
  • speex降噪算法移植及测试
    下载libspeexdspPC上,编译。修改内置demo输入in.pcm,输出out.pcm,用音频分析软件及实测效果OK.#ifdefHAVE_CONFIG_H#include"config.h"#endif#include"speex/speex_preprocess.h"#include<stdio.h>#defineNN160intmain(){  shortin[NN];  inti;  SpeexPre......
  • speexdsp库实现音频3A算法
    speex是音频编解码库,speexdsp是附加的音频DSP库,是音频降噪库,也有回声抑制和自动增益控制功能,即通常说的音频3A算法。现在音频编解码大部分都是使用opus库,很少使用speex进行音频编解码,但还是会使用speexdsp库的3A算法对音频数据进行处理。本例是在ubuntu环境下,C/C++语言,使用Qt进......
  • 算法竞赛文件读写
    freopen使用freopen进行文件读写,可以节约测试时重复输入的时间,用法可以参考官网std::freopen-cppreference.com。程序中使用cin/cout和scanf/printf均可。模板#include<cstdio>usingnamespacestd;intmain(){//提交时记得将这两行注释掉freopen("E:\\c\\in......
  • Lnton羚通视频分析算法平台人员闯入算法检测告警详细介绍
    Lnton羚通的算法算力云平台有以下显著特点:高性能、高可靠性、高可扩展性和低成本。用户可以通过该云平台获取高效、强大的算法计算服务,快速而灵活地运行各种复杂的计算模型和算法。该平台广泛涵盖机器学习、人工智能、大数据分析和图像识别等领域。此外,云平台还提供丰富的算法库和......
  • 【理论优化算法】基于理论和优化算法求解单目标优化问题附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 【雷电附着算法】基于雷电附着优化算法LAPO求解单目标优化问题附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 视频监控/安防监控/视频AI智能分析:小动物识别算法场景汇总
    随着人们对生态环境的关注日益提升,大家对动物保护意识也逐渐增强。旭帆科技智能分析网关小动物识别算法应运而生。除了对保护动物的识别以外,旭帆科技AI智能分析网关还可以识别常见的老鼠等动物,助力明厨亮灶监管,保卫食品安全。TSINGSEE青犀AI智能分析网关小动物识别算法,可以应用于各......