java 随机数算法_Java随机数算法原理与实现方法实例详解

java 随机数算法_Java随机数算法原理与实现方法实例详解本文实例讲述了Java随机数算法。分享给大家供大家参考,具体如下:软件实现的算法都是伪随机算法,随机种子一般是系统时间在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次,即形如:ax≡b(modn)的方程。此方程有解当且仅当b能够被a与n的最大公约数整除(记作gcd(a,n)|b)。这时,如果x0是方程的一个解,那么所有的解可以表示为:{x0+k…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

本文实例讲述了Java随机数算法。分享给大家供大家参考,具体如下:

软件实现的算法都是伪随机算法,随机种子一般是系统时间

在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次,即形如:

ax≡b (mod n)的方程。此方程有解当且仅当 b 能够被 a 与 n 的最大公约数整除(记作 gcd(a,n) | b)。这时,如果 x0 是方程的一个解,那么所有的解可以表示为:

{x0+kn/d|(k∈z)}

其中 d 是a 与 n 的最大公约数。在模 n 的完全剩余系 {0,1,…,n-1} 中,恰有 d 个解。

例子编辑

* 在方程 3x ≡ 2 (mod 6) 中, d = gcd(3,6) = 3 ,3 不整除 2,因此方程无解。

* 在方程 5x ≡ 2 (mod 6) 中, d = gcd(5,6) = 1,1 整除 2,因此方程在{0,1,2,3,4,5} 中恰有一个解: x=4。

* 在方程 4x ≡ 2 (mod 6) 中, d = gcd(4,6) = 2,2 整除 2,因此方程在{0,1,2,3,4,5} 中恰有两个解: x=2 and x=5。

纯线性同余随机数生成器

线性同余随机数生成器介绍:

古老的LCG(linear congruential generator)代表了最好最朴素的伪随机数产生器算法。主要原因是容易理解,容易实现,而且速度快。

LCG 算法数学上基于公式:

X(0)=seed;

X(n+1) = (A * X(n) + C) % M;

其中,各系数为:

X(0)表示种子seed

模M, M > 0

系数A, 0 < A < M

增量C, 0 <= C < M

原始值(种子) 0 <= X(0) < M

其中参数c, m, a比较敏感,或者说直接影响了伪随机数产生的质量。

一般来说我们采用M=(2^31)-1 = 2147483647,这个是一个31位的质数,A=48271,这个A能使M得到一个完全周期,这里C为奇数,同时如果数据选择不好的话,很有可能得到周期很短的随机数,例如,如果我们去Seed=179424105的话,那么随机数的周期为1,也就失去了随机的意义。

(48271*179424105+1)mod(2的31次方-1)=179424105

package test;

import java.util.HashMap;

import java.util.Map;

import java.util.concurrent.atomic.AtomicLong;

public class Random {

public final AtomicLong seed=new AtomicLong();

public final static long C = 1;

public final static long A = 48271;

public final static long M = (1L << 31) – 1;

public Random(int seed){

this.seed.set(seed);

}

public Random(){

this.seed.set(System.nanoTime());

}

public long nextLong(){

seed.set(System.nanoTime());

return (A *seed.longValue() + C) % M;

}

public int nextInt(int number){

return new Long( (A * System.nanoTime() + C) % number).intValue();

}

public static void main(String[] args) {

System.out.println(new Random().nextLong());

Map map=new HashMap();

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

int ran=new Random().nextInt(10);

if(map.containsKey(ran)){

map.put(ran, map.get(ran)+1);

}else{

map.put(ran, 1);

}

}

System.out.println(map);

}

}

自己写个简单例子,随机10万次,随机范围0到9,看看是否均匀

abb51faa6f9b8baf9642a2578974af16.png

相对来说还是挺均匀的

PS:这里再为大家提供几款功能类似的在线工具供大家参考:

希望本文所述对大家java程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158915.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mybatis嵌套查询的使用[通俗易懂]

    mybatis嵌套查询的使用[通俗易懂]当我们遇到表与表之之间存在关联的时候,就可以使用mybatis的嵌套查询比如说当一个对象包含了另一个对象/***公交实体类中包含了司机信息和路线信息*/publicclassBusimplementsSerializable{privateIntegerid;privateStringcard;privateIntegerd…

  • PS套索工具抠图及快捷键[通俗易懂]

    PS套索工具抠图及快捷键[通俗易懂]一、首先打开Photoshop,并打开一张所需的要抠图的文件,并按Ctrl+J复制一层二、套索工具在工具栏的上方,快捷键为L。鼠标点击工具栏选择套索工具,或按快捷键L选择,套索工具有三个子工具菜单,套索,多边形套索和磁性套索1.普通套索工具。这个工具时根据操作者控制鼠标的路径来选取选取的,且精度不易控制,完全靠制作者的手法来控制精度我们只要选择这个工具,然后按着鼠标左键开始跟着鼠标轨迹把选取描绘出来,最后松开鼠标,即可完成2.多边形套索工具。适合选取比较规则的几何图形首先点区图片要扣取的一

  • $.ajax not function(已 解决:jQuery库冲突解决办法)

    $.ajax not function(已 解决:jQuery库冲突解决办法)

  • 数据库的数据模型是网状模型_网状模型的数据结构是

    数据库的数据模型是网状模型_网状模型的数据结构是层次数据模型    定义:层次数据模型是用树状<层次>结构来组织数据的数据模型。    满足下面两个条件的基本层次联系的集合为层次模型    1.有且只有一个结点没有双亲结点,这个结点称为根结点    2.根以外的其它结点有且只有一个双亲结点其实层次数据模型就是的图形表示就是一个倒立生长的树,由基本数据结构中的树(或者二叉树)的定义可知,每棵树都有且仅有一个根节点,其余的…

    2022年10月29日
  • 利用STM32F103精确控制步进电机「建议收藏」

    利用STM32F103精确控制步进电机「建议收藏」**利用STM32F103控制步进电机精确角度转动**欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器,可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,…

  • 电脑装机必备app_电脑装机必备的软件有哪些

    电脑装机必备app_电脑装机必备的软件有哪些每个人的电脑上都会安装各种各样的软件。不同年龄段,不同人生时期,不同工作环境下的人都会有属于自己专业的软件工具。当然大多人都会有一些共有的软件。比如360,QQ。今日无事。来和大家探讨下电脑装机软件。一般电脑装机软件我分为四类:一、装机必备类二、娱乐休闲类三、日常工具类四、工作类office系列:无论微软还是金山的WPS,

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号