源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-09-16 00:33 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java随机数算法原理与实现方法实例详解
本文实例讲述了Java随机数算法。分享给大家供大家参考,具体如下: 软件实现的算法都是伪随机算法,随机种子一般是系统时间 在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次,即形如: [code]ax≡b (mod n)[/code]的方程。此方程有解当且仅当 b 能够被 a 与 n 的最大公约数整除(记作 [code]gcd(a,n) | b[/code])。这时,如果 x0 是方程的一个解,那么所有的解可以表示为: [code]{x0+kn/d|(k∈z)}[/code] 其中 d 是a 与 n 的最大公约数。在模 n 的完全剩余系 {0,1,…,n-1} 中,恰有 d 个解。 例子编辑 * 在方程 [code]3x ≡ 2 (mod 6)[/code] 中, [code]d = gcd(3,6) = 3[/code] ,3 不整除 2,因此方程无解。 * 在方程 [code]5x ≡ 2 (mod 6)[/code] 中, [code]d = gcd(5,6) = 1[/code],1 整除 2,因此方程在{0,1,2,3,4,5} 中恰有一个解: x=4。 * 在方程 [code]4x ≡ 2 (mod 6)[/code] 中, [code]d = gcd(4,6) = 2[/code],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,看看是否均匀 [img]http://files.jb51.net/file_images/article/201709/2017919100039913.jpg?201781910059[/img] 相对来说还是挺均匀的 [b]PS:这里再为大家提供几款功能类似的在线工具供大家参考:[/b] [b]在线随机数字/字符串生成工具: [/b][url=http://tools.jb51.net/aideddesign/suijishu]http://tools.jb51.net/aideddesign/suijishu[/url] [b]在线随机字符/随机密码生成工具: [/b][url=http://tools.jb51.net/aideddesign/rnd_password]http://tools.jb51.net/aideddesign/rnd_password[/url] [b]高强度密码生成器: [/b][url=http://tools.jb51.net/password/CreateStrongPassword]http://tools.jb51.net/password/CreateStrongPassword[/url] 更多关于java算法相关内容感兴趣的读者可查看本站专题:《[url=http://www.1sucai.cn/Special/632.htm]Java数据结构与算法教程[/url]》、《[url=http://www.1sucai.cn/Special/947.htm]Java字符与字符串操作技巧总结[/url]》、《[url=http://www.1sucai.cn/Special/830.htm]Java操作DOM节点技巧总结[/url]》、《[url=http://www.1sucai.cn/Special/687.htm]Java文件与目录操作技巧汇总[/url]》和《[url=http://www.1sucai.cn/Special/682.htm]Java缓存操作技巧汇总[/url]》 希望本文所述对大家java程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部