Java编程中随机数的生成方式总结_java

本章先讲解Java随机数的几种产生方式,然后通过示例对其进行演示。
广义上讲,Java中的随机数的有三种产生方式:
(01). 通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字。
(02). 通过Math.random()返回一个0到1之间的double值。
(03). 通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。第1种 利用System.currentTimeMillis()获取随机数
通过System.currentTimeMillis()来获取随机数。实际上是获取当前时间毫秒数,它是long类型。使用方法如下:

final long l = System.currentTimeMillis();

若要获取int类型的整数,只需要将上面的结果转行成int类型即可。比如,获取[0, 100)之间的int整数。方法如下:

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

第2种 利用Math.random()获取随机数
通过Math.random()来获取随机数。实际上,它返回的是0(包含)到1(不包含)之间的double值。使用方法如下:

final double d = Math.random();

若要获取int类型的整数,只需要将上面的结果转行成int类型即可。比如,获取[0, 100)之间的int整数。方法如下:

final double d = Math.random();
final int i = (int)(d*100);

第3种 利用Random类来获取随机数
通过Random类来获取随机数。
使用方法如下:
(01) 创建Random对象。有两种方法可以创建Random对象,如下:

Random random = new Random();//默认构造方法
Random random = new Random(1000);//指定种子数字

(02) 通过Random对象获取随机数。Random支持的随机值类型包括:boolean, byte, int, long, float, double。
比如,获取[0, 100)之间的int整数。方法如下:

int i2 = random.nextInt(100);

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 种子设置此随机数生成器的种子。

获取随机数示例

eg1:
下面通过示例演示上面3种获取随机数的使用方法。 源码如下(RandomTest.java):

import java.util.Random;
import java.lang.Math;

/**
 * java 的随机数测试程序。共3种获取随机数的方法:
 *  (01)、通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字。
 *  (02)、通过Math.random()返回一个0到1之间的double值。
 *  (03)、通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。
 *
 * @author skywang
 * @email kuiwu-wang@163.com
 */
public class RandomTest{

  public static void main(String args[]){

    // 通过System的currentTimeMillis()返回随机数
    testSystemTimeMillis();

    // 通过Math的random()返回随机数
    testMathRandom();

    // 新建“种子为1000”的Random对象,并通过该种子去测试Random的API
    testRandomAPIs(new Random(1000), " 1st Random(1000)");
    testRandomAPIs(new Random(1000), " 2nd Random(1000)");
    // 新建“默认种子”的Random对象,并通过该种子去测试Random的API
    testRandomAPIs(new Random(), " 1st Random()");
    testRandomAPIs(new Random(), " 2nd Random()");
  }

  /**
   * 返回随机数-01:测试System的currentTimeMillis()
   */
  private static void testSystemTimeMillis() {
    // 通过
    final long l = System.currentTimeMillis();
    // 通过l获取一个[0, 100)之间的整数
    final int i = (int)( l % 100 );

    System.out.printf("\n---- System.currentTimeMillis() ----\n l=%s i=%s\n", l, i);
  }

  /**
   * 返回随机数-02:测试Math的random()
   */
  private static void testMathRandom() {
    // 通过Math的random()函数返回一个double类型随机数,范围[0.0, 1.0)
    final double d = Math.random();
    // 通过d获取一个[0, 100)之间的整数
    final int i = (int)(d*100);

    System.out.printf("\n---- Math.random() ----\n d=%s i=%s\n", d, i);
  }

  /**
   * 返回随机数-03:测试Random的API
   */
  private static void testRandomAPIs(Random random, String title) {
    final int BUFFER_LEN = 5;

    // 获取随机的boolean值
    boolean b = random.nextBoolean();
    // 获取随机的数组buf[]
    byte[] buf = new byte[BUFFER_LEN];
    random.nextBytes(buf);
    // 获取随机的Double值,范围[0.0, 1.0)
    double d = random.nextDouble();
    // 获取随机的float值,范围[0.0, 1.0)
    float f = random.nextFloat();
    // 获取随机的int值
    int i1 = random.nextInt();
    // 获取随机的[0,100)之间的int值
    int i2 = random.nextInt(100);
    // 获取随机的高斯分布的double值
    double g = random.nextGaussian();
    // 获取随机的long值
    long l = random.nextLong();

    System.out.printf("\n---- %s ----\nb=%s, d=%s, f=%s, i1=%s, i2=%s, g=%s, l=%s, buf=[",
        title, b, d, f, i1, i2, g, l);
    for (byte bt:buf)
      System.out.printf("%s, ", bt);
    System.out.println("]");
  }
}

eg2:

问题:生成(-10,10)之间的保留小数点后两位数的随机数。
解决方法:
1.java中随机数生成函数Random r=new Random(); r.nextFloat();//生成(0,1)之间的浮点型随机数。将上述随机数乘以10,得到生成(0,10)之间的随机数。
2.生成一个Boolean型的随机数用于控制数的正负:r.nextBoolean();
3.保留小数位数两位的方法:Math.floor(n*100+0.5)/100;得到的数为double型。
代码如下:
  

import java.util.*;
  public class CreateRandom {
   public float numRandom(){
    float num;
    Random r=new Random();
    float value = (float) (Math.floor(r.nextFloat()*1000+0.5)/100);
    Boolean b = r.nextBoolean();
    if(b){
     num = value;
     }
    else{
     num=0-value;
     }
    return num;
    }
    public static void main(String[] args) {
     CreateRandom cr = new CreateRandom();
     float num = cr.numRandom();
     System.out.print(num);
    }
  }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
随机数
java随机数生成1到10、java生成随机数、java随机数生成1到100、java生成不重复随机数、java 生成6位随机数,以便于您获取更多的相关知识。

时间: 2024-10-02 10:58:59

Java编程中随机数的生成方式总结_java的相关文章

Java编程中正则表达式的用法总结_java

1. 字符串中的正则表达式使用正则表达式可以对字符串进行查找.提取.分割.替换等操作.String类当中提供了如下几个特殊方法: boolean matches(String regex):判断该字符串是否匹配指定的正则表达式. String replaceAll(String regex, String replacement):将该字符串中所有匹配regex的子串替换成replacement. String[] split(String regex):以regex作为分隔符,把该字符串分割成

Java编程中的一些常见问题汇总_java

本文列举了我在周围同事的Java代码中看到的一些比较典型的错误.显然,静态代码分析(我们团队用的是qulice)不可能发现所有的问题,这也是为什么我要在这里列出它们的原因. 如果你觉得少了什么,请不吝赐教,我会很乐意把它们加上. 下面列出的所有这些错误基本都与面向对象编程有关,尤其是Java的OOP. 类名 读下这篇短文"什么是对象".类应该是真实生活中的一个抽象实体,而不是什么"validators","controller", "m

深入解析Java编程中final关键字的作用_java

final class当一个类被定义成final class,表示该类的不能被其他类继承,即不能用在extends之后.否则在编译期间就会得到错误. package com.iderzheng.finalkeyword; public final class FinalClass { } // Error: cannot inherit from final class PackageClass extends FinalClass { } Java支持把class定义成final,似乎违背了面

整理Java编程中字符串的常用操作方法_java

字符一般情况下,当我们处理字符时,我们用原始数据类型 char. 示例 char ch = 'a'; // Unicode for uppercase Greek omega character char uniChar = '\u039A'; // an array of chars char[] charArray ={ 'a', 'b', 'c', 'd', 'e' }; 然而在开发中,我们会遇到需要使用对象而不是原始数据类型的情况.为了达到这个需求.Java 为原始数据类型 char 提

详解Java编程中super关键字的用法_java

通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的. 好了,现在开始讨论this&super这两个关键字的意义和用法.在Java中,this通常指当前对象,super则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的,当

简单了解Java编程中对异常处理的运用_java

Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象.当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被抛出(throw).该方法可以选择自己处理异常或传递该异常.两种情况下,该异常被捕获(caught)并处理.异常可能是由Java运行时系统产生,或者是由你的手工代码产生.被Java抛出的异常与违反语言规范或超出Java执行环境限制的基本错误有关.手工编码产生的异常基本上用于报告方法调用程序的出错状况. Java异常处理通过5个关键字控制:try.catch.th

详解Java编程中对线程的中断处理_java

1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时--都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制. 如果对Java中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此.中断机制是如何工作的?捕获或检测到中断后,是抛出InterruptedException还是重设中断状态以及在方法中吞掉中断状态会有什么后果?Thread.st

深入解析Java编程中final关键字的使用_java

在Java中声明属性.方法和类时,可使用关键字final来修饰.final变量即为常量,只能赋值一次:final方法不能被子类重写:final类不能被继承.1.final成员声明 final 字段有助于优化器作出更好的优化决定,因为如果编译器知道字段的值不会更改,那么它能安全地在寄存器中高速缓存该值.final 字段还通过让编译器强制该字段为只读来提供额外的安全级别.  1.1关于final成员赋值1)在java中,普通变量可默认初始化.但是final类型的变量必须显式地初始化.   2)fin

详解Java编程中向量(Vector)的应用_java

Vector(向量)是 java.util 包中的一个类,该类实现了类似动态数组的功能. 向量和数组相似,都可以保存一组数据(数据列表).但是数组的大小是固定的,一旦指定,就不能改变,而向量却提供了一种类似于"动态数组"的功能,向量与数组的重要区别之一就是向量的容量是可变的. 可以在向量的任意位置插入不同类型的对象,无需考虑对象的类型,也无需考虑向量的容量. 向量和数组分别适用于不同的场合,一般来说,下列场合更适合于使用向量: 如果需要频繁进行对象的插入和删除工作,或者因为需要处理的对