闲聊

妈耶,又这么久没写了。。不过最近写其他文章有点多啊。。。

今天用到Random这个类,竟然还要去查了下。。。


基本概念

Random类,背后是伪随机数(数学上的东西);

不是很理解,但是基本上而言,就是生成个set(无序列表)

本质是个seed的东西,根据这个的不同生成不同的Random类;

默认的构造方法有两种:

Random rand1 = new Random();

Random rand2 = new Random(seed);

第一种构造方式会按照代码自己的方式,尽量找一个独特的seed生成类;

第二种构造方式会根据seed生成Random类;


使用

主要就是类中的各种数据类型的随机数的生成了;

比如整数,double,long , boolean

进而得到各种想要的数据范围,比如[1,3],就是rand.nextInt(4)

具体解释可以看下:JAVA的Random类(转)

关键点:

  • nextInt(n):得到[0,n)范围内的一个整数;
  • nextDouble():得到0-1之间的一个小数;

自己测试下

@Test
public void testRandom(){
Random random = new Random();
LOGGER.info("double:"+String.valueOf(random.nextDouble()));
LOGGER.info("boolean:"+String.valueOf(random.nextBoolean()));
LOGGER.info("int:"+String.valueOf(random.nextInt()));
LOGGER.info("long:"+String.valueOf(random.nextLong())); //0-1的小数
LOGGER.info("0-1:"+String.valueOf(random.nextDouble())); //0-100的小数
LOGGER.info("0-100:"+String.valueOf(random.nextDouble()*100)); //-1到10的整数
LOGGER.info("-1-10:"+String.valueOf((random.nextInt(12)-1)));
LOGGER.info("-1-10:"+String.valueOf((random.nextInt(12)-1)));
LOGGER.info("-1-10:"+String.valueOf((random.nextInt(12)-1)));
LOGGER.info("-1-10:"+String.valueOf((random.nextInt(12)-1)));
LOGGER.info("-1-10:"+String.valueOf((random.nextInt(12)-1)));
LOGGER.info("-1-10:"+String.valueOf((random.nextInt(12)-1)));
LOGGER.info("-1-10:"+String.valueOf((random.nextInt(12)-1)));
LOGGER.info("-1-10:"+String.valueOf((random.nextInt(12)-1))); Random random1 = new Random(10);
LOGGER.info("r1:"+String.valueOf((random1.nextInt(12)-1)));
Random random2 = new Random(10);
LOGGER.info("r2:"+String.valueOf((random2.nextInt(12)-1))); //看源码就是Random
Math.random(); // Collections.shuffle();
// 源码
}

另外,如果seed是相同的,如上述代码最后一段,那么Random类中的set也是一样的,就可以控制随机。。伪随机。。。

灵活应用中,我觉得最屌的是,固定中的随机:

  • 60%的概率是选项A;

注意随机的是概率,范围是100!

int n5 = r.nextInt(100);

        int m; //结果数字

        if (n5 < 55)

        { //55个数字的区间,55%的几率

            m = 1;

        } else if (n5 < 95)

        {//[55,95),40个数字的区间,40%的几率

            m = 2;

        } else

        {

            m = 3;

        }


稍稍引申下

刚好用到shuffle()函数

Collections.shuffle(list);

这个的基本操作是:

  • 循环list
  • 每次将当前位置对象,跟随机位置对象交换(swap)

。。。

然后,关于Math.random(),彻头彻尾就是封装了下rand.nextDouble()

【技术累积】【点】【java】【5】Random和shuffle()的更多相关文章

  1. (转)如何学习Java技术?谈Java学习之路

    51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...

  2. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

  3. Java API —— Random类

    1.Random类概述         此类用于产生随机数         如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列. 2.构造 ...

  4. java.util.Random深入理解

    java.util.Random next方法的原理 比较好的参考文档: http://isky001.iteye.com/blog/1339979 package random.utilrandom ...

  5. [转] JAVA的Random类

    Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要 ...

  6. java java.uitl.Random产生随机数

    通过使用java.uitl.Random产生一个1-10内的随机数.例: Random random = new Random(); int i = Math.abs(random.nextInt() ...

  7. java.util.Random 类的 nextInt(int num )

    随机产生3个67~295的整数并找出数值居中的数 并输出中间的数例如:100,225和200,输出200 要随机产生某个范围内的整数,用 java.util.Random 类的 nextInt(int ...

  8. Java基础-Random类(05)

    随机数(Random) 作用:用于产生一个随机数 使用步骤(和Scanner类似) 导包import java.util.Random; 创建对象Random r = new Random(); 获取 ...

  9. 【java】彩票中奖码生成器:java.util.Random里的方法public int nextInt(int bound)

    package 彩票中奖码生成器; import java.util.Random; public class TestRandom { public static void main(String[ ...

随机推荐

  1. Vue学习之路第二十篇:Vue生命周期函数-组件创建期间的4个钩子函数

    1.每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等.同时在这个过程中也会运行一些叫做生命周期钩子的函数 ...

  2. python中字节与字符串的转换

    #bytes object    byte = b"byte example"     # str object    str = "str example" ...

  3. 07.网络编程-3.TCP

    1.tcp相关介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC ...

  4. PHP socket初探 --- 关于IO的一些枯燥理论

    [原文地址:https://blog.ti-node.com/blog...] 要想更好了解socket编程,有一个不可绕过的环节就是IO.在Linux中,一切皆文件.实际上要文件干啥?不就是读写么? ...

  5. C#学习笔记_05_输入输出

    05_输入输出 输出语句 Console.WriteLine( ); 将括号内内容输出到控制台,并且换行 Console.Write( ); 将括号内内容输出到控制台,不换行 Console.Writ ...

  6. hdu 1713求分数的最小公倍数

    题意中的圈数和天数说反了 #include<stdio.h> __int64 gcd(__int64 a,__int64 b) {/* 比如4/3 3/5 通分20/15 9/15 所以这 ...

  7. HDU - 1723 - Distribute Message

    先上题目: Distribute Message Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  8. 【ACM】poj_2080_Calendar_201307311043

    CalendarTime Limit: 1000MS  Memory Limit: 30000K Total Submissions: 9787  Accepted: 3677 Description ...

  9. 【ACM】hdu_1092_A+BIV_201307261630

    A+B for Input-Output Practice (IV)Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3276 ...

  10. HDU 4512 最长公共上升子序列

    各种序列复习: (1)最长上升子序列. 1.这个问题用动态规划就很好解决了,设dp[i]是以第i个数字结尾的上升子序列的最长长度.那么方程可以是dp[i]=max(dp[j]+1).(j<i). ...