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

    推荐阅读
  • 深圳上新能源车牌条件(深圳上新能源车牌条件)

    深圳上新能源车牌条件主要有4个,一是必须居住在本市,二是驾证为C类或者以上,三是名下没有本市登记的汽车,四是名下没有指标或者不具有更新指标的申请资格。深圳上新能源车牌所需要的资料:1、新车注册登记的,包括车主身份证、车辆发票、车辆合格证、购置税证明等。

  • 火锅中一般用毛肚还是牛肚(吃火锅都必点毛肚)

    最后,毛肚本身是黑色的,而白毛肚是经过双氧水处理后变成的一种加工食品。闻气味毛肚是牛的胃瓣,会有些许腥味,而经过泡制毛肚的会吸收药水,就会散发出一股异味来。柔韧度正常情况下的好毛肚,用筷子指拉拽有韧性,而经过双氧水浸泡的毛肚,发脆,稍一拉扯就会断裂碎掉。看气泡新鲜的毛肚下锅烫几秒就会起泡,类似人皮肤烫伤,而放久了的毛肚由于细胞已经丧失活性所以不会起泡。

  • 胡问鸣受贿、国有公司人员滥用职权案一审宣判

    上海市第一中级人民法院认为,被告人胡问鸣的行为构成受贿罪和国有公司人员滥用职权罪。胡问鸣受贿数额特别巨大,徇私舞弊滥用职权致使国家利益遭受特别重大损失,均应依法惩处,予以并罚。

  • 人教版三年级数学分数比较大小(人教版三年级数学上册8单元同分母分数的大小比较课件及练习)

    电子课本知识点同分母分数的大小比较:1.同分母分数,分子大的分数大,分子小的分数小;2.一个分数的分子和分母相同时,表示把一个物体或图形平均分成几份,取的份数与分的份数一样多,也就是1。同分子分数的大小比较:同分子分数,分母大的分数小,分母小的分数大。参考答案图文解读图文解读同步练习1同步练习2

  • 简述网站建设需要注意哪些细节(完成一个网站建设需要做好哪些准备)

    企业用户选择托管建站公司如果企业用户我选择托管建站公司的话,一般情况下他们都是一条龙服务的,需要准备的就是企业的营业执照以及备案的资料。当然,如果企业不想备案的话,可以直接使用香港主机就可以。一般情况下,这样的话选择可以降低运营成本。一般情况下,网站建站公司都会提供源码服务。

  • 岂以己之心度人之腹乎(岂无膏沐适为己容)

    今天我去买菜,卖菜大姐老远打招呼说:“漂亮妹妹,买什么菜?”。果然蔬菜非常新鲜。

  • 跳绳能减肥吗怎么跳才能瘦下来(跳绳可以减肥吗)

    跳绳能减肥吗怎么跳才能瘦下来吾日三省吾身瘦否?不过由于每个人的体重、体脂数值不同,因此透过跳绳消耗的卡路里、减肥效果也有所不同。因此建议早晨空腹时跳绳,或是傍晚晚餐前执行跳绳训练,更能有效提升体内循环、心肺耐力,且不会引起肠胃不适。END图文均源于网络侵权即删

  • 为什么汤加没派人参会冬奥会(易靖坤汤加火山爆发)

    海啸由火山爆发导致的海底地震、海底崩塌和大气重力波共同引发,海啸波袭击了环太平洋上的大部分沿海国家,日本、秘鲁、智利、美国等都观测到不同程度的海啸波,截至目前海啸已经造成秘鲁两人遇难。对于火山灰,目前来说首先是蘑菇云团下会有火山灰降落。火山灰会影响通讯和交通,污染水源,此外火山灰含有大量有毒物质,吸入火山灰会对呼吸道造成严重影响。爆炸后岛屿基本上消失。

  • 凤凰火哪里多(哪里凤凰火多)

    凤凰火哪里多《阴阳师》凤凰火击杀地点:探索副本第三章boss一只、御魂副本第七层第一回合1只、斗技和结界突破中遇到的也算。故事发生在人鬼共生的年代,原本属于阴界的魑魅魍魉,潜藏在人类的恐慌中伺机而动,阳界的秩序岌岌可危。幸而世间有着一群懂得观星测位、画符念咒,还可以跨越阴阳两界,甚至支配灵体的异能者,他们正各尽所能,为了维护阴阳两界的平衡赌上性命战斗并被世人尊称为“阴阳师”。

  • 西安雁塔区免费药品领取指南(西安市雁塔区食药监局电话)

    一、领取药品种类退烧药:复方乙酰水杨酸片二、领取时间2022年12月26日至12月28日,每天下午2点至4点三、领取证件凭借身份证免费领取;每人限领6片四、雁塔区众信药店领取地址及方位图1、雁塔区电子正街69号唐园新苑3幢2、雁塔区丈八北路茶张馨苑内铺3、雁塔区二环南228号中海华庭第1幢4、雁塔区大寨路西段铭城国际社区1号楼5、雁塔区科技路195号6、朱雀大街直机关三爻小区综合楼C区1-4层7、