时间:2021-05-20
本文实例讲述了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<Integer,Integer> map=new HashMap<Integer,Integer>(); 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,看看是否均匀
相对来说还是挺均匀的
PS:这里再为大家提供几款功能类似的在线工具供大家参考:
在线随机数字/字符串生成工具:
http://tools.jb51.net/aideddesign/suijishu
在线随机字符/随机密码生成工具:
http://tools.jb51.net/aideddesign/rnd_password
高强度密码生成器:
http://tools.jb51.net/password/CreateStrongPassword
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java中随机数的产生方式与原理查阅随机数相关资料,特做整理首先说一下java中产生随机数的几种方式在j2se中我们可以使用Math.random()方法来产生
js生成1到100的随机数js生成随机数使用math.random()函数Math.random()具体实现:1、定义一个random()函数,原理是随机数和最
C++随机数与随机种子数的实例实现效果图:实例代码:#include#include#includeusingnamespacestd;voidTest(){i
本文实例讲述了java生成随机数的方法。分享给大家供大家参考。具体实现方法如下:packagecom.tool.code;importjava.util.Ran
本文实例为大家分享了java实现猜数字游戏的具体代码,供大家参考,具体内容如下1.游戏分析:游戏第一步:需要一个随机数,并且该随机数有范围;(java的包中有一