欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法学习(二)Java/C++分别实现生成随机数 之一

程序员文章站 2022-06-01 12:12:18
...

算法学习(二)由于太长了所以我就把它分成两部分了!
大家可以根据不同的链接选择不同的语言哦!
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 = %s\n",i1);

        // 利用Math.random()方法产生随机数(最常用)
        final double d = Math.random();
        final int i2 = (int)(d *100);       // 产生[0,100)之间的随机数
        System.out.printf("\n————Math.random————\n i = %s\n",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 = %s\n", 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中随机数的理解!欢迎大家评论区进行指导!

相关标签: 随笔