77百科网
当前位置: 首页 生活百科

java中random和if组合用法(Javarandom随机数)

时间:2023-06-06 作者: 小编 阅读量: 1 栏目名: 生活百科

java中random和if组合用法伪随机:通过算法产生的随机数都是伪随机!!只有通过真实的随机事件产生的随机数才是真随机!!比如,通过机器的硬件噪声产生随机数、通过大气噪声产生随机数Random生成的随机数都是伪随机数!!!是由可确定的函数,通过一个种子,产生的伪随机数。每遍输出的多个序列均不同。Random用种子seed构造一个随机数生成器,种子是给定的。

java中random和if组合用法?伪随机(preundorandom):通过算法产生的随机数都是伪随机,现在小编就来说说关于java中random和if组合用法?下面内容希望能帮助到你,我们来一起看看吧!

java中random和if组合用法

伪随机(preundorandom):通过算法产生的随机数都是伪随机!!

只有通过真实的随机事件产生的随机数才是真随机!!比如,通过机器的硬件噪声产生随机数、通过大气噪声产生随机数

Random生成的随机数都是伪随机数!!!

是由可确定的函数(常用线性同余),通过一个种子(常用时钟),产生的伪随机数。这意味着:如果知道了种子,或者已经产生的随机数,都可能获得接下来随机数序列的信息(可预测性)

Random类拥有两个构造方法,用于实现随机数生成器:

    Random( ) 构造一个随机数生成器,种子是 与nanoTime异或后的值。每遍输出的多个序列均不同。随机性更强。

    Random(long seed) 用种子seed构造一个随机数生成器,种子是给定的。每遍输出的多个序列均相同。

源码:

/*** Creates a new random number generator. This constructor sets* the seed of the random number generator to a value very likely* to be distinct from any other invocation of this constructor.*/public Random() {this(seedUniquifier() ^ System.nanoTime());//与System.nanoTime()异或//这里System.nanoTime();并不是以纳秒为单位的系统时间,只用来计算花费多少时间用的。与时间的概念无关。}private static long seedUniquifier() {// L'Ecuyer, "Tables of Linear Congruential Generators of// Different Sizes and Good Lattice Structure", 1999for (;;) {long current = seedUniquifier.get();long next = current * 181783497276652981L;if (seedUniquifier.compareAndSet(current, next))return next;}}private static final AtomicLong seedUniquifier= new AtomicLong(8682522807148012L); //种子分配器/*** Creates a new random number generator using a single {@code long} seed.* The seed is the initial value of the internal state of the pseudorandom* number generator which is maintained by method {@link #next}.** <p>The invocation {@code new Random(seed)} is equivalent to:*<pre> {@code* Random rnd = new Random();* rnd.setSeed(seed);}</pre>** @param seed the initial seed* @see#setSeed(long)*/public Random(long seed) {//无参构造,有参构造,均是调用这个方法if (getClass() == Random.class)// Random random1 = new Random();或者Random random2 = new Random(100); 均是调用这个ifthis.seed = new AtomicLong(initialScramble(seed));//处理后,seed值没变else {// subclass might have overriden setSeedthis.seed = new AtomicLong();setSeed(seed);}}private static long initialScramble(long seed) {return (seed ^ multiplier) & mask;}

一、无参构造方法(不设置种子)

虽然表面上看我们未设置种子,但Random构造方法里有一套自己的种子生成机制,源码如上。

生成种子过程:(参考解密随机数生成器(二)——从java源码看线性同余算法)

    获得一个长整形数作为“初始种子”(系统默认的是8682522807148012L)

    不断与一个变态的数——181783497276652981L相乘(天知道这些数是不是工程师随便滚键盘滚出来的-.-)得到一个不能预测的值,直到 能把这个不能事先预期的值 赋给Random对象的静态常量seedUniquifier 。因为多线程环境下赋值操作可能失败,就for(;;)来保证一定要赋值成功

    与系统随机出来的nanotime值作异或运算,得到最终的种子

nanotime算是一个随机性比较强的参数,用于描述代码的执行时间。源码中关于nanotime的描述(部分):

并不是以纳秒为单位的系统时间,只用来计算花费多少时间用的。与时间的概念无关。

/*** Returns the current value of the running Java Virtual Machine's* high-resolution time source, in nanoseconds.** <p>This method can only be used to measure elapsed time and is* not related to any other notion of system or wall-clock time.* The value returned represents nanoseconds since some fixed but* arbitrary <i>origin</i> time (perhaps in the future, so values* may be negative).The same origin is used by all invocations of* this method in an instance of a Java virtual machine; other* virtual machine instances are likely to use a different origin.** <p>This method provides nanosecond precision, but not necessarily* nanosecond resolution (that is, how frequently the value changes)* - no guarantees are made except that the resolution is at least as* good as that of {@link #currentTimeMillis()}.** <p>Differences in successive calls that span greater than* approximately 292 years (2<sup>63</sup> nanoseconds) will not* correctly compute elapsed time due to numerical overflow.** <p>The values returned by this method become meaningful only when* the difference between two such values, obtained within the same* instance of a Java virtual machine, is computed.** <p> For example, to measure how long some code takes to execute:*<pre> {@code* long startTime = System.nanoTime();* // ... the code being measured ...* long estimatedTime = System.nanoTime() - startTime;}</pre>** <p>To compare two nanoTime values*<pre> {@code* long t0 = System.nanoTime();* ...* long t1 = System.nanoTime();}</pre>** one should use {@code t1 - t0 < 0}, not {@code t1 < t0},* because of the possibility of numerical overflow.** @return the current value of the running Java Virtual Machine's*high-resolution time source, in nanoseconds* @since 1.5*/public static native long nanoTime();

二、有参构造方法(设置种子)

语法:Random ran = Random(long seed)

有参构造方法的源码如上。

其中的multiplier和mask都是定值:

private static final long multiplier = 0x5DEECE66DL;private static final long mask = (1L << 48) - 1;

三、代码测试

分别采用有参和无参两种方法,生成[0, 100)内的随机整数,各生成五组,每组十个随机数:

import java.util.Random;public class RandomTest {public static void main(String[] args) {RandomTest rt = new RandomTest();rt.testRandom();}public void testRandom(){System.out.println("Random不设置种子:");for (int i = 0; i < 5; i) {Random random = new Random();for (int j = 0; j < 10; j) {System.out.print(" "random.nextInt(100)", ");}System.out.println("");}System.out.println("");System.out.println("Random设置种子:");for (int i = 0; i < 5; i) {Random random = new Random();random.setSeed(100);for (int j = 0; j < 10; j) {System.out.print(" "random.nextInt(100)", ");}System.out.println("");}} }

运行结果如下:

结论:

虽然二者都是伪随机,但是,无参数构造方法(不设置种子)具有更强的随机性,能够满足一般统计上的随机数要求。使用有参的构造方法(设置种子)无论你生成多少次,每次生成的随机序列都相同,名副其实的伪随机!!

四、为何要使用种子?

种子就是生成随机数的根,就是产生随机数的基础。计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数。Java项目中通常是通过Math.random方法和Random类来获得随机数。

Random类中不含参构造方法每次都使用当前时间作为种子,而含参构造方法是以一个固定值作为种子。

随机数是种子经过计算生成的。

不含参的构造函数每次都使用当前时间作为种子,随机性更强

随机数的生成是从种子值开始。 如果反复使用同一个种子,就会生成相同的数字系列,产生不同序列的一种方法是使种子值与时间相关。

五、System.nanoTime()

System.out.println(System.nanoTime());//并不是以纳秒为单位的系统时间System.out.println(System.nanoTime());System.out.println(System.nanoTime());System.out.println(System.currentTimeMillis());//第一遍运行://281092180853691//281092180911666//281092180936920//1610767387212=>2021-01-16 11:23:07//第二遍运行://281207286912695//281207286952070//281207286970745//1610767502318

以上运行、源码基于jdk1.8

end

    推荐阅读
  • 吃杨桃的正确吃法(如何吃杨桃)

    下面更多详细答案一起来看看吧!吃杨桃的正确吃法杨桃榨汁,喝新鲜杨桃也可以直接榨汁,新鲜阳桃3枚,以清水洗净,用水果刀将之切成果肉丁,并捣烂绞汁,将果汁倒人杯中,加温开水100毫升调匀,每日服用2次。醋渍杨桃,取新鲜杨桃1枚,红醋50毫升。将阳桃以清水洗净,后用水果刀一分为二,将鲜果放人杯中,加红醋浸10分钟后取出,慢慢嚼服。

  • 大众POLO买哪款好 大众polo哪款性价比最高

    Cross版Polo的配置没有增加,但多功能方向盘和头部气帘有所减少,但外观的变化非常明显。这套16寸车轮不仅造型抢眼,还能显著提升PoloGTI的凶猛度和战斗指数。Polo智乐版不仅价格便宜,而且装备齐全。由于采用了目前Polo的动力系统,新Polo的动力性能与旧Polo并无不同。日常驾驶中,新款Polo整体噪音控制良好,车门密封到位,轮胎噪音和风噪控制良好。

  • 长沙5号线地铁线路图最新规划(长沙地铁5号线年底试运行)

    日前,长沙地铁5号线一期工程大塘站至雨花区政府站区间轨排完成合龙。14日,有网友曝光了地铁5号线列车。花花了解到,截至目前,5号线一期工程全线18个车站主体结构、19段区间均已全部完成,已进入附属、铺轨、车辆段、主变电站施工和机电设备安装及装饰装修阶段。全体参建者正加班加点、稳步推进项目建设,力争2019年12月30日实现通车试运行、2020年7月实现初期运营。

  • 世界花城是哪个城市 世界花城是哪个城市?

    巴黎有很多头衔,它是法国的政治、经济、文化中心,也是四大世界级的城市之一,还是法国最大的工商业城市。

  • 为什么南京财经大学不是211(南京财经大学比211分还高的双非)

    南京财经大学是一所财经类公立大学,也被称为“南财”,目前由江苏省主管,是一所以经济管理类学科为主,多个学科协调发展的院校。目前学校是江苏省省重点建设大学,也是江苏省省级博士立项建设单位,目前拥有仙林、福建路和桥头3个校区,占地面积约为120万平方米。

  • 六十伏58安电瓶用多少充电器(退货率为一般货的1)

    更安全的电动车充电器充帮主电动车充电器与深意商贸结为战略合作伙伴平舆县隶属河南省驻马店,北距郑州约300公里。一个“安”字,是贯穿中国文化的标记之一。国家倡导,树立安全发展理念,弘扬生命至上、安全第一的思想,健全公共安全体系,完善安全生产责任制,坚决遏制重特大安全事故,提升防灾减灾救灾能力。“安”,更是一份沉甸甸的承诺,一群人的负重前行,只为芸芸众生的岁月静好。

  • 王者荣耀小乔独角兽皮肤兑换了(王者荣耀小乔新皮肤独角兽度假台词)

    王者荣耀小乔新皮肤缤纷独角兽语音视频王者荣耀小乔新皮肤台词1.夏侯哥哥,稳住别浪。视频已经爆料出来了,官方那边的宣传页预计这几天就会上传高清视频上去,最快的话7月底就有就会看到新皮肤上线,反正今年暑假7月、8月是肯定会出来的。好了,上面就是王者荣耀小乔新皮肤独角兽度假台词视频了,关注一下琵琶网王者荣耀官网,更多更详细的游戏资讯为你一一分享。

  • 开学第一课观后感初一(开学观后感简介)

    下面内容希望能帮助到你,我们来一起看看吧!开学第一课观后感初一今天是开学的第一天,我们班主任组织了我们全班同学一起观看了由中央电视台主办的公益节目《开学第一课》。在我心心念念的叨叨中,节目在8点准时开始了。今天的《开学第一课》是以一首《国旗国旗真美丽》来开场,表明了此次的主题,接下来便是以各位时代楷模讲述自己的故事了,节目的内容很是丰富,随着节目的开场和深入,我不禁地被迷上了。

  • 四大古刹之首(小县城的皇家古刹为何能安然屹立千年)

    1961年被国务院确立为全国第一批重点文物保护单位,2012年进入中国世界文化遗产预备名单。据《辽史》记载,契丹人早就宣称他们是黄帝或炎帝的后裔,与汉族等其他中原民族一样是炎黄子孙。历史学家和考古界专家对此有多种说法,这也是学术界多年来一直争论的话题。因此,处理朝中军政大事,多由皇后萧绰代理。同年十二月,病逝于行宫,享年五十七岁。

  • 杂粮煎饼的做法和配料(杂粮煎饼的做法和配料简述)

    杂粮煎饼的做法:放好面糊,我来为大家讲解一下关于杂粮煎饼的做法和配料?跟着小编一起来看一看吧!打上鸡蛋并刮匀。放上香菜香葱和榨菜,可以根据当地适当调节。折叠一下,抹上独家秘制甜面酱和辣椒酱。放上脆饼和生菜。卷好后,在中间切开,对折即可。杂粮煎饼的配料:面糊配方及秘制酱料。