这里有新鲜出炉的 Java 设计模式,程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称.
这篇文章主要介绍了 Java 随机数算法原理与实现方法, 简单分析了随机数算法的原理并结合具体实例形式给出了 java 编程计算随机数的具体操作技巧, 需要的朋友可以参考下
本文实例讲述了 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
自己写个简单例子,随机 10 万次,随机范围 0 到 9,看看是否均匀
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);
}
}
相对来说还是挺均匀的
PS:这里再为大家提供几款功能类似的在线工具供大家参考:
希望本文所述对大家 java 程序设计有所帮助.
来源: http://www.phperz.com/article/18/0115/353463.html