引子:需要实现每天随机获得一个礼包,且全服玩家随出来的都是同一个。

实现方案:以当前时间是一年的第几天作为random的种子,取1~礼包总个数范围内的随机值。

  public static int getBuffId() {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.nanoTime());
int dateInYear = c.get(Calendar.DAY_OF_YEAR);
return new Random(dateInYear).nextInt() + ;
}

于是决定深入了解一下随机数的种子。

Random两种构造方法。一种是无参构造函数。种子是 ++seedUniquifier + System.nanoTime(), 所以每新new一个Random实例,种子都会变。

private static volatile long seedUniquifier = 8682522807148012L;
public Random() { this(++seedUniquifier + System.nanoTime()); }

另一种是设置种子的构造方法。

 public Random(long seed) {
this.seed = new AtomicLong(0L);
setSeed(seed);
}

看一下next()方法。每次调用next()方法。种子就会发生变化  nextseed = (oldseed * multiplier + addend) & mask;

private final static long multiplier = 0x5DEECE66DL;
private final static long addend = 0xBL;
private final static long mask = (1L << ) - ;
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));//保证oldseed跟nextseed不相同
return (int)(nextseed >>> ( - bits));
}
public int nextInt() {
return next();
}

实例:

//实例1
Random random = new Random();
for (int i = ; i < ; i++) {
System.out.println(random.nextInt());
} System.out.println("..........."); //实例2
for (int j = ; j < ; j++) {
System.out.println(new Random().nextInt());
}

运行结果:

-

-
...........
-
-
-
-

分析:运行结果不一样。原因如下:

实例1设定了种子1000,for循环里,nextSeed一直在变,所以随出来的值也每次不一样。

实例2每次new一个新的Random对象,每次seed都会被重置成1000,后面调用nextInt() 算出来的nextSeed都是同一个值,所以不管循环几次,随出来的结果都一样。

java 随机数种子的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. JAVA生成随机数种子的方法

    Java里面有一个随机函数——Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结:   Java中存在着两种Random函数: 一. ...

  3. java.uti.Random类nextInt方法中随机数种子为47的奇怪问题

    一,问题描述 需要生成一个[0,1]的随机数.即随机生成 0 或者 1.使用java.util.Random类的 nextInt(int)方法,当构造Random类的对象并提供随机数种子时,发现了一个 ...

  4. [Java 安全]加密算法

    Base64编码 算法简述 定义 Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别. Base64是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的A ...

  5. 编写高质量代码:改善Java程序的151个建议(第2章:基本类型___建议26~30)

    建议26:提防包装类型的null值 我们知道Java引入包装类型(Wrapper Types)是为了解决基本类型的实例化问题,以便让一个基本类型也能参与到面向对象的编程世界中.而在Java5中泛型更是 ...

  6. 随机数是骗人的,.Net、Java、C为我作证(转)

    几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数.比如在.Net中编写下面的代码: Random rand = ne ...

  7. Java中有四种常见的Map实现方法

    在 HTML5 之前我们做图片预览主流做法有两种,第一种是通过 Flash 插件来做预览,第二种是 Ajax 实现的假预览,也就是说选择图片文件后,图片其实已经异步上传到服务器,服务器处理后返回图片路 ...

  8. 随机数是骗人的,.Net、Java、C为我作证

    几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数.比如在.Net中编写下面的代码: Random rand = ne ...

  9. [改善Java代码]不要随便设置随机种子

    建议30: 不要随便设置随机种子 随机数在太多的地方使用了,比如加密.混淆数据等,我们使用随机数是期望获得一个唯一的.不可仿造的数字,以避免产生相同的业务数据造成混乱.在Java项目中通常是通过Mat ...

随机推荐

  1. 巅峰极客第二场CTF部分writeup

    word-MISC 微信回答问题+word字体里. sqli-WEB 注册个admin空格即可,长字符截断. 晚上把后续的写出来.现在睡觉

  2. inet_confirm_addr && confirm_addr_indev

    确认给定参数范围的ip地址是否存在: /* * Confirm that local IP address exists using wildcards: * - net: netns to chec ...

  3. Web服务器处理动态程序三种方式及Apache配置

    模块.CGI.FastCGI三种方式介绍 以PHP脚本为例: 模块方式是指Web服务器通过libphp5.so模块调用PHP服务,模块将相关函数嵌入Web服务请求处理流程,不需要额外解释器进程.注意, ...

  4. python开发web服务器——搭建简易网站

    参看:https://blog.csdn.net/baidu_35085676/article/details/69807145

  5. LeetCode解题报告—— Minimum Window Substring && Largest Rectangle in Histogram

    1. Minimum Window Substring Given a string S and a string T, find the minimum window in S which will ...

  6. 湖南省第六届省赛题 Biggest Number (dfs+bfs,好题)

    Biggest Number 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 You have a maze with obstacles and non-zero di ...

  7. 如何去除decimal后面的零?

    如何去除decimal后面的零? 1.260000m.ToString("G29") 不显示科学记数法? decimal.Parse("0.0000001",S ...

  8. Download Percona Monitoring Plugins

    https://www.percona.com/downloads/percona-monitoring-plugins/LATEST/

  9. 救济金发放(UVa133)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...

  10. HTTP权威指南读书笔记(一)HTTP概述、URL和资源及报文详解

    一.HTTP概述 1.WEB客户端和服务器. 2.资源:资源可以是各种格式的静态文件,也可以是应用程序. 3.媒体类型 4.URI:统一资源标识符 URL:统一资源定位符. URL的第一部分称为方案: ...