Java中实现随机数算法的原理是什么-创新互联-成都创新互联网站建设

关于创新互联

多方位宣传企业产品与服务 突出企业形象

公司简介 公司的服务 荣誉资质 新闻动态 联系我们

Java中实现随机数算法的原理是什么-创新互联

本篇文章为大家展示了Java中实现随机数算法的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

创新互联主要从事网站设计、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务扶余,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220

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

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

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);
 }
}

分享题目:Java中实现随机数算法的原理是什么-创新互联
分享网址:http://kswsj.cn/article/codcjo.html

其他资讯