Java random 随机数种子

举报
福州司马懿 发表于 2021/11/19 05:51:09 2021/11/19
【摘要】 一、概述 (1)java.util.Random.Random() public Random() { this(seedUniquifier() ^ System.nanoTime()); ...

一、概述
(1)java.util.Random.Random()

public Random() {
    this(seedUniquifier() ^ System.nanoTime());
}
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.
  
 
  • 1
  • 2
  • 3
  • 4

创建一个新的随机数生成器。该构造函数设置随机数种子的方式非常不同于其他的构造函数。

(2)java.util.Random.Random(long seed)

Creates a new random number generator using a single long seed. The seed is the initial value of the internal state of the pseudorandom number generator which is maintained by method next. 
  
 
  • 1

使用一个随机数种子,创建一个新的随机数生成器。该种子是由next函数维护的伪随机数生成器的内部状态的初始值。

(3)int java.util.Random.nextInt(int bound)

Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence. The general contract of nextInt is that one int value in the specified range is pseudorandomly generated and returned. All bound possible int values are produced with (approximately) equal probability. 
  
 
  • 1

返回一个从随机数生成序列提取的均匀分布在0(包括)和bound指定的值(不包括)的伪随机数。nextInt函数约定了在指定范围内的一个整数被伪随机的产生并返回。所有区域范围内的值都有一个(大致)相同的生成概率。

二、代码实战

package com.demo.test;

import java.util.Random;

public class RandomDemo {

    public static void main(String[] args) {
        int bound = 10;
        Random random = new Random();
        for(int i=0;i<10;i++) {
            int value = random.nextInt(bound);
            System.out.println(value+"");
        }
        System.out.println("====================");

        //不用currentTimeMillis的原因是:当多线程调用时,由于CPU速率很快,因此currentTimeMillis很可能相等,使得随机数结果也会相等
//      long seed1 = System.currentTimeMillis();
//nanoTime()返回最准确的可用系统计时器的当前值,以毫微秒为单位。此方法只能用于测量已过的时间,与系统或钟表时间的其他任何时间概念无关。
        long seed1 = System.nanoTime();
        Random seedRandom1 = new Random(seed1);
        for(int i=0;i<10;i++) {
            /*
             产生一个[0,bound)之间的随机数
             设a<b, 要产生一个[a,b)之间的随机数的公式为:
             int value = a + random.nextInt(b-a);
             */
            int value = seedRandom1.nextInt(bound);
            System.out.println(value+"");
        }
        System.out.println("====================");

        long seed2 = 10;
        //当种子一样的时候,虽然每次nextXXX的方法会返回不同的结果,但是由于每次new Random(相同的seed)创建的“随机数生成器”都相同,因此之后产生的随机数序列也就都是一样的。所以每次调用该函数生成随机数都会产生相同的结果。
        Random seedRandom2 = new Random(seed2);
        for(int i=0;i<10;i++) {
            int value = seedRandom2.nextInt(bound);
            System.out.println(value+"");
        }
    }

}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

三、运行截图(这里我运行了3次)
这里写图片描述这里写图片描述这里写图片描述

从运行结果可以看出当“随机数种子”相同的时候,每次调用该函数产生的结果都一样,所以在实际运行环境中,我们应该避免使用相同的随机数种子,常用的方法就是使用System.nanoTime来为作为种子。

文章来源: blog.csdn.net,作者:福州-司马懿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/chy555chy/article/details/52150163

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。