我是靠谱客的博主 热心诺言,最近开发中收集的这篇文章主要介绍算法学习(二)Java/C++分别实现生成随机数 之一Java实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

算法学习(二)由于太长了所以我就把它分成两部分了!
大家可以根据不同的链接选择不同的语言哦!
Java实现
C++实现

Java实现

Java实现生成随机数有三种方法:
1、通过 System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字
2、通过 Math.random()返回一个 [0,1) 之间的 double型
3、通过 Random类产生一个随机数,Random类是一个专业工具,其中包含很多产生随机数的函数。

1. 利用System.currentTimeMillis()

实际是获取当前时间的毫秒数(long 型),使用方法如下:

final long l = System.currentTimeMillis();  	// 这里为了识别的方便,定义 l表示long型

如果想要获得int型且在一定范围的整数,对 num进行强制类型转换,再进行取余即可。如,获取一个[0,100)的int型随机数,我们可以这样做:

final long l = System.currentTimeMillis();
final int i = (int)( l %100);

2.利用Math.random()

利用Math.random()获得的随机数是[0,1)之间的double型。据说利用Math.random()产生的随机数更能确保线程安全,多线程环境能被调用。(可以参考文末的第二个链接)
若无特殊情况大多使用 (type)(Math.random() *n)方法产生随机数。且该方法相对方便。
具体使用方法如下:

final double d = Math.random();	
final int i = (int)(d*100);	// 产生一个[0,100)的整型随机数

3.利用Random

这个方法就比较专业啦!
在创建 Random类的对象之前我们现在开头引入Random类:

import java.util.Random;

创建Random对象,去Random类中看一下其构造方法,在下方的Random类的函数接口有详细介绍!

Random random1 = new Random();	// 利用默认构造方法
Random random2 = new Random(100);	// 指定随机种子

然后我们来通过Random对象来获取随机数。Random支持的随机值的类型包括: boolean,byte,int, long, float, double。
比如,获取[0,50)之间int型的随机数:

int i = random1.nextInt(50);

Random类的函数接口

这里大家注意喽!Random.nextInt()中可以有参数,其他像double、float啦可以用类似于Math.random()方法中的方式来约束区间。

// 构造方法(一):创建一个新的随机数生成器
Random()
// 构造方法(二):使用单个long种子创建一个新的随机数生成器:public Random(long seed) {setSeed(seed);}
// next 方法使用它来保存随机数生成器的状态
Random(long seed)

boolean nextBoolean()				// 返回一个“boolean类型”伪随机数
void       nextBytes(byte[] buf)    // 生成随即字节并将其置于字节数组buf中
double     nextDouble() 			// 返回一个“[0.0, 1.0)之间的double型”随机数
float      nextFloat()  			// 返回一个“[0.0, 1.0)之间的float类型”的随机数
int        nextInt()				// 返回一个“int类型”随机数
int		   nextInt(int n)			// 返回一个“[0, n)之间的int型”随机数
long       nextLong()				// 返回一个“long类型”随机数
synchronized double nextGaussian()	// 返回一个“double类型”的随机数,它是呈高斯分布的 double值,其平均值是 0.0,标准差为 1.0.
synchronized void setSeed(long seed)// 使用单个long种子设置此随机数生成器的种子

好啦!下面彪JAVA代码喽!

package Demo1.Demo1_5;

import java.util.Random;

public class Demo1_5_main {
    public static void main(String[] args) {

        // 利用System.currentTimeMillis()产生随机数
        final long l = System.currentTimeMillis();
        final int i1 = (int)(l %100);       // 产生[0,100)之间的随机数
        System.out.printf("n————System.currentTimeMillis()————n i = %sn",i1);

        // 利用Math.random()方法产生随机数(最常用)
        final double d = Math.random();
        final int i2 = (int)(d *100);       // 产生[0,100)之间的随机数
        System.out.printf("n————Math.random————n i = %sn",i2);

        // 利用Random类产生随机数(最专业)
        // 生成三个Random 类的对象,并为 random2和 random3设置相同的随机种子
        Random random1 = new Random();
        Random random2 = new Random(100);
        Random random3 = new Random(100);
        System.out.println("n————Random.nextInt(10)————n");
        for(int i = 0; i<10; i++) {
            System.out.printf("r1 = %s ; r2 = %s ; r3 = %sn", random1.nextInt(10), random2.nextInt(10), random3.nextInt(10));
        }
    }
}

这里值得一提的是,在上述代码中,random2和 random3设置了相同的随机种子,因此产生了相同的随机数,且在每次运行的时候所产生的随机数也都相同,因此我们称之为伪随机数。
伪随机数即为有规则的随机,具体表现为:相同种子数的Random对象生成的随机数序列相同!

补充:在这里再详细补充一下Random中的构造方法吧!

从下面Random类中可以看到,默认构造方法里使用当前系统时间相关的一个数字作为随机种子,所以默认构造方法所产生的随机数在每次运行代码时候都不相同。

public Random() {
  this(seedUniquifier() ^ System.nanoTime());
}

public Random(long seed) {
    if (getClass() == Random.class)
        this.seed = new AtomicLong(initialScramble(seed));
    else {
        // subclass might have overriden setSeed
        this.seed = new AtomicLong();
        setSeed(seed);
    }
}

而且大家要注意哦~随机种子仅仅是作为随机算法的起源数字而已,与生成的随机数区间没有关系!

Java部分就到这里了,以上内容是自己在学习算法过程中参考两位博主的整理,大家想继续详细了解的可以去参考下面两个链接!
https://www.cnblogs.com/skywang12345/p/3341423.html
https://blog.csdn.net/u012099869/article/details/50394644
这篇是我对Java中随机数的理解!欢迎大家评论区进行指导!

最后

以上就是热心诺言为你收集整理的算法学习(二)Java/C++分别实现生成随机数 之一Java实现的全部内容,希望文章能够帮你解决算法学习(二)Java/C++分别实现生成随机数 之一Java实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部