概述
算法学习(二)由于太长了所以我就把它分成两部分了!
大家可以根据不同的链接选择不同的语言哦!
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实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复