Java随机数的产生方式

本章先讲解Java随机数的几种产生方式,然后通过示例对其进行演示。

广义上讲,Java中的随机数的有三种产生方式: (01). 通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字。 (02). 通过Math.random()返回一个0到1之间的double值。 (03). 通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。

第1种

通过System.currentTimeMillis()来获取随机数。实际上是获取当前时间毫秒数,它是long类型。使用方法如下:

finallong l = System.currentTimeMillis();

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

finallong l = System.currentTimeMillis();finalint i = (int)( l % 100 );

第2种

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

finaldouble d = Math.random();

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

finaldouble d = Math.random();finalint i = (int)(d*100);

第3种

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

获取随机数示例

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/Java/

下面通过示例演示上面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("]");
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, random
, system.out.printf()
, 随机
, 随机数
, 类型
, java 转行 c++
, System.out.printf
, 一个
, 随机函数random
, Math类型
, random随机数
, 随机获取
java随机数函数
java产生随机数、java产生不重复随机数、java如何产生随机数、java怎么产生随机数、java 产生1 10随机数,以便于您获取更多的相关知识。

时间: 2024-10-29 10:46:53

Java随机数的产生方式的相关文章

Java中随机数的产生方式与原理详解_java

Java中随机数的产生方式与原理 查阅随机数相关资料,特做整理 首先说一下java中产生随机数的几种方式 在j2se中我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以100,他就是个100以内的随机数字,这个在j2me中没有. 在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,他可以生产随机整数.随机float.随机double.随机long,这个也是我们在j2me

java 随机数高效生成

分享牛,分享牛原创.近期去面试经常被问到java如何生产随机数,以及生成很大的字符串保证不能重复,还要考虑性能,之前本人面试别人的时候,可能不会问这个问题.既然这个java随机数问题经常被问到,那咱们也就写几种实现方式吧.仅供参考. 1.1.1. 第一种方式 第一种方式,咱们考虑一下,生成的字符串不能重复,怎么办呢?首先想到hashMap.hashSet的特性吧.那怎么就先用这种方式实现吧.以下是hashMap的实现方式. public static void main(String[] arg

谈谈JAVA中的调用方式

很多书籍都说Java支持传引用调用的方式,类似于C++中的Person &a引用调用,而近来编程遇到一系列问题让我对此产生了怀疑,于是将这些方法一一列出,我们来一起看看JAVA中的调用方式:   看下面的程序:  class Person {      private String name;//姓名     private String sex;//性别     public Person(String x, String y) {         this.name = x;        

java随机数类Random简介

Java实用工具类库中的类java.util.Random提供了产生各种类型随机数的方法.它可以产生int.long.float.double以及Goussian等类型的随机数.这也是它与java.lang.Math中的方法Random()最大的不同之处,后者只产生double型的随机数. 类Random中的方法十分简单,它只有两个构造方法和六个普通方法. 构造方法: (1)public Random() (2)public Random(long seed) Java产生随机数需要有一个基值s

Java中5种方式实现String反转_java

这里介绍Java中5中实现String反转的方式. 一.数组实现String反转 //数组实现String反转 public String reverseByArray(){ if(str == null || str.length() == 1){ return null; } char[] ch = str.toCharArray();//字符串转换成字符数组 for(int i = 0 ; i < ch.length/2 ; i++){ char temp = ch[i]; ch[i] =

我想问关于java随机数的问题,这两个随机获取哪个好?

问题描述 我想问关于java随机数的问题,这两个随机获取哪个好? 第一个: public static void SuiJiZiFuChuan(int x, int y) { for (int j = 0; j < y; j++) { for (int i = 0; i < x; i++) { int a = (int) (100 * Math.random() + 100 * Math.random()); //区别在这里,那个好 while (true) { if (a > 96 &

请教一个关于java随机数的

问题描述 请教一个关于java随机数的 要做一个东西,整一个随机数,在原先的数量的基础上再增加一个随机数这个是部分代码这样对吗 解决方案 Java如何获得一个随机数---------------------- 解决方案二: 强制转换成int 的地方注意一下 ,很容易出错,最好不要用这种方法. Math.random()-----返回的是0-1之间的浮点数 Math.random(n)----返回的是0-(n-1)之间的某个数(这个数应该是整数,这里忘记了,楼主自己验证) 解决方案三: Rando

java累加和校验实现方式16进制(推荐)_java

已知一个字符串,求该字符串的16进制累加和,已知一段字符串和校验码,校验和累加是否合法,话不多说了直接上代码 public static String makeChecksum(String data) { if (data == null || data.equals("")) { return ""; } int total = 0; int len = data.length(); int num = 0; while (num < len) { Str

java常见的序列化方式_java

在远程调用中,需要把参数和返回值通过网络传输,这个使用就要用到序列化将对象转变成字节流,从一端到另一端之后再反序列化回来变成对象. 既然前面有一篇提到了hessian,这里就简单讲讲Java序列化和hessian序列化的区别. 首先,hessian序列化比Java序列化高效很多,而且生成的字节流也要短很多.但相对来说没有Java序列化可靠,而且也不如Java序列化支持的全面.而之所以会出现这样的区别,则要从它们的实现方式来看. 先说Java序列化,具体工作原理就不说了,Java序列化会把要序列化