Java两种常用的随机数生成方式(小白总结)

人机交互过程中,当我们需要机器给我们反馈不确定的数字结果时,就会需要用到随机数了,那么,在Java中,我们应当如何来生成并使用随机数呢?

一、通过Random类来实现

Random类是JDK的java.util包中的一个工具类,该类可用于在指定范围内产生随机数字。考察一下Random类的两种构造方法:无参构造和有参构造

Random(); 无参构造方法创建一个伪随机数生成器。Random(long seed);有参构造方法使用一个long型的种子创建伪随机数生成器。
下面分别使用两种方式创建Random对象来获取10个0到100的随机数

无参构造方式

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

运行结果:

这里总结一个应用random.nextInt()的式子:random.nextInt(n)+m,返回的是m到m+n-1之间的随机数。比如random.nextInt(9)+1,得到就是1到10之间的某数,如果没有n和m,那么就是生成一个随机的int类型的值。当然除了int类型,也可以生成其他数字型的基本数据类型的随机数,比如double、float、byte等等。

  • nextDouble()方法返回的是0.0到1.0之间的一个double类型的值
  • nextFloat()方法返回的是0.0到1.0之间的一个float类型的值

有参构造方式

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

这里为了方便跟无参构造方法创建的随机数生成器作比较,创建了两个Random对象。

运行结果:

再执行一次代码的结果:

怎么样?是不是发现下面的有参构造生成的随机数每次运行结果都是一样的,而无参构造方法的random对象每次都能得到不同的随机数。

这里的原因是:无参构造方法在创建Random对象时没有传入种子参数,程序会自动以当前时间为时间戳,于是每一次的运行结果都是不同的。而有参构造方法创建Random对象时传入了种子参数,两次运行时种子相同,实际上不管运行多少次,结果都是一样的。

二、使用Math类的random方法

Java中的Math类也提供了一个生成随机数的random方法。
首先需要明确,Math.random()是随机生成一个0.0到1.0之间的double类型的随机数,这里包含0而不包含1。

常见的用法:

public class demo1 {
  public static void main(String[] args) {
    for (int i = 0; i < 3; i++) {
      System.out.println((int) (Math.random() * 10));
    }
  }

Math.random()生成0到1之间的double数,乘以10就变成了0到10之间的double数,再转成int型,这是我平时接触比较多的用法(通常我们使用随机数也是int类型的居多)。运行结果如下(3个0到10之间的整数):

根据需要可以灵活使用random()方法:

  • (int)(Math.random()*n)生成大于等于0小于n的随机数。
  • (int)(Math.randon()*n)+m生成大于等于m小于m+n的之间的随机数。
  • (int)(Math.random()*(n-m)+m)生成从m到n范围内的数,包含m不包含n。

另外,我们还可以用这种方式生成字符:

随机生成a~z之间的字符
(char)(‘a'+Math.random()*(‘z'-‘a'+1));

随机生成cha1~cha2的字符
(char)(cha1+Math.random()*(cha2-cha1+1));

小结

以上就是近期自己总结的两种Java中生成随机数的方法,实际上打开Math类中的random方法的源码我们可以发现,这个方法就是直接调用Random类中的nextDouble方法来实现的。至于实际使用看个人爱好吧,比较推荐直接使用Math类的random方法,要记住的是,以上两种方法生成的随机数都是会重复的,如果有不能重复的需求,则需要添加其他操作了。

到此这篇关于Java两种常用的随机数生成方式(小白总结)的文章就介绍到这了,更多相关Java 随机数生成内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java随机数生成具体实现代码

    本文实例为大家分享了java随机数生成代码,供大家参考,具体内容如下 package com.gonvan.common.utils; import java.util.*; /** * 随机数工具 * * @author yuerzm * */ public final class LotteryAliasMethod { /** * The random number generator used to sample from the distribution. */ private fin

  • java实现随机数生成器

    本文实例为大家分享了java实现随机数生成器的具体代码,供大家参考,具体内容如下 自己编的随机数生成器,比较简陋,功能也单一,当作练手. Application.java package src; public class Application { public static void main(String[] args) { WindowBoxLayout win=new WindowBoxLayout(); win.setBounds(100,200,300,350); win.setT

  • java的三种随机数生成方式的实现方法

    随机数的产生在一些代码中很常用,也是我们必须要掌握的.而java中产生随机数的方法主要有三种: 第一种:new Random() 第二种:Math.random() 第三种:currentTimeMillis() 第一种需要借助java.util.Random类来产生一个随机数发生器,也是最常用的一种,构造函数有两个,Random()和Random(long seed).第一个就是以当前时间为默认种子,第二个是以指定的种子值进行.产生之后,借助不同的语句产生不同类型的数. 种子就是产生随机数的第

  • 史上最全的java随机数生成算法分享

    复制代码 代码如下: String password = RandomUtil.generateString(10); 源码如下: 复制代码 代码如下: package com.javaniu.core.util;import java.util.Random;public class RandomUtil { public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS

  • Java两种常用的随机数生成方式(小白总结)

    人机交互过程中,当我们需要机器给我们反馈不确定的数字结果时,就会需要用到随机数了,那么,在Java中,我们应当如何来生成并使用随机数呢? 一.通过Random类来实现 Random类是JDK的java.util包中的一个工具类,该类可用于在指定范围内产生随机数字.考察一下Random类的两种构造方法:无参构造和有参构造 Random(): 无参构造方法创建一个伪随机数生成器.Random(long seed):有参构造方法使用一个long型的种子创建伪随机数生成器. 下面分别使用两种方式创建Ra

  • Java 两种延时thread和timer详解及实例代码

    Java 两种延时thread和timer详解及实例代码 在Java中有时候需要使程序暂停一点时间,称为延时.普通延时用Thread.sleep(int)方法,这很简单.它将当前线程挂起指定的毫秒数.如 try { Thread.currentThread().sleep(1000);//毫秒 } catch(Exception e){} 在这里需要解释一下线程沉睡的时间.sleep()方法并不能够让程序"严格"的沉睡指定的时间.例如当使用5000作为sleep()方法的参数时,线 程

  • Android 中倒计时验证两种常用方式实例详解

    Android 中倒计时验证两种常用方式实例详解 短信验证码功能,这里总结了两种常用的方式,可以直接拿来使用.看图: 说明:这里的及时从10开始,是为了演示的时间不要等太长而修改的. 1.第一种方式:Timer /** * Description:自定义Timer * <p> * Created by Mjj on 2016/12/4. */ public class TimeCount extends CountDownTimer { private Button button; //参数依

  • java两种单例模式用法分析

    本文实例讲述了java两种单例模式用法.分享给大家供大家参考,具体如下: 按照加载方式的不同,单例模式有两种实现: private:只能在同一个类中使用 static:该类是类方法,不能调用实例方法./类全局变量 final:方法或成员变量不能被修饰 1.饿汉式 public class EagerSigleton{ private static final EagerSigleton instance=new EagerSigleton(); private EagerSigleton(){}

  • 详解Spring Cloud Config采用Git存储时两种常用的配置策略

    由于Spring Cloud Config默认采用了Git存储,相信很多团队在使用Spring Cloud的配置中心时也会采用这样的策略.即便大家都使用了Git存储,可能还有各种不同的配置方式,本文就来介绍一下两种常用的配置策略. 第一种:多个项目公用一个Git仓库,用不同的目录区分项目 主要的配置项如下: spring.cloud.config.server.git.uri=https://github.com/dyc87112/config-repo.git spring.cloud.con

  • Java两种方式实现动态代理

    一.JDK动态代理 Java 在 java.lang.reflect 包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及 InvocationHandler 便可为目标接口生成代理类及代理对象.我们称这个Java技术为:动态代理 @CallerSensitive public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, Invoca

  • Java两种方法计算出阶乘尾部连续0的个数

    第一个方法是计算出阶乘然后计算字符串的0的个数. import java.util.Scanner; import java.math.BigDecimal; import java.text.DecimalFormat; public class jc{ public static void main(String args[]){ Scanner reader = new Scanner(System.in); DecimalFormat a = new DecimalFormat("#&q

  • Java四种常用线程池的详细介绍

    一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务. 2. 线程池的工作机制 2.1 在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程

  • 浅谈C#与Java两种语言的比较

    C#与Java相比较 从整体上来看,c#和java及其相似,甚至超过了c#与c.c++的相似程度,下面是两种语言的比较. 两者都能编译成跨平台,跨语言的代码,而且代码能都在一个手控制的环境中运行. 两者都不需要头文件,所有代码都被限制在某个范围内,并且因为没有头文件,所有消除了类定义的循环依赖. 自动回收垃圾内存,并且取消了指针类型. 所有的类都是派生出来的,并且必须使用New关键字分配内存. 没有全局函数或者全局变量,一切变量和函数都属于类. 数组和字符串都自带长度计算和边界检查. 不能使用整

  • Java几种常用的断言风格你怎么选

    日常工作中,不管你是写Unit Test,还是采用TDD的编程方式进行开发,都会遇到断言.而断言的风格常见的会有Assert.BDD风格,对于这些常见的断言风格你怎么选择呢? 01 Assert风格 JUnit中提供了这样的assert断言风格,例如: void should_be_unlocked_when_insert_coin_given_a_entrance_machine_with_locked_state() { EntranceMachine entranceMachine = n

随机推荐