zoukankan      html  css  js  c++  java
  • Java中在特定区间产生随机数

    生成指定范围内的随机数
    这个是最常用的技术之一。程序员希望通过随机数的方式来处理众多的业务逻辑,测试过程中也希望通过随机数的方式生成包含大量数字的测试用例。问题往往类似于:
    如何随机生成 1~100 之间的随机数,取值包含边界值 1 和 100。
    或者是:
    如何随机生成随机的3位整数?
    等等……
    以 Java 语言为例,我们观察其 Random 对象的 nextInt(int) 方法,发现这个方法将生成 0 ~ 参数之间随机取值的整数。例如(假设先有 Random rand = new Random();,下同):
    rand.nextInt(100);
    这行代码将生成范围 0~100 之间的随机数,有趣的是,取值可能为 0 ,但不可能为 100。我们用中学数学课学习的区间表示法,表示为:[0, 100)。
    那么如果要获得区间 [1~100] 的随机数,该怎么办呢?稍微动动脑筋就可以想到:区间 [0, 100) 内的整数,实际上就是区间 [0, 99]。因为最大边界为100,可惜不能等于100,因此最大可能产生的“整数”就是99。
    既然 rand.nextInt(100) 获得的值是区间 [0, 99],那么在这个区间左右各加 1,就得到了区间 [1, 100]。因此,代码写成:
    rand.nextInt(100) + 1;
    即可。运行下面的代码,将获得 [1, 100] 的 10 个取值。
    //// 代码段 3 //////////////////////////////////////////////////////////////
    import java.util.Random;
    public class Test {
    public static void main(String[] args){
      Random rand = new Random();
      for(int i=0; i<10; i++) {
       System.out.println(rand.nextInt(100) + 1);
      }
    }
    }
    //// 代码段 3 结束 /////////////////////////////////////////////////////////
    编译运行,输出结果为:
    81
    64
    31
    86
    56
    14
    45
    57
    28
    90
    多次运行,结果每次都不同,但取值一定会在 1 和 100 之间,可能出现 1 和 100。
    同理,很容易知道如果要获得随机两位整数,代码写成:
    rand.nextInt(90) + 10;
    你一定很惊讶,为什么是这么写出来的。其实,在 nextInt() 方法中作为参数的数字 90 表示:你希望生成的随机数的所有取值的可能性的数量(在本命题中,两位整数取值为 [10, 99],共90个数);加好后面的数字 10 ,表示区间的最小取值。
    你可以验证下,按照这样理解,[1, 100] 的随机数,是不是应该写成 rand.nextInt(100) + 1 。千万不要把参数 100 理解为最大取值。只是区间 [1, 100] 正好从 1 开始,所以最大取值和取值可能性数量正好同为 100。
    因此,
    生成随机三位数的代码为:
    rand.nextInt(900) + 100;
    生成区间 [64, 128] 中随机值的代码为:
    rand.nextInt(65) + 64;
    取值可能性的数量是如何计算出来的呢?当然是 最大取值-最小取值+1 ,所以,有最终公式如下:
    // For Java
    int randNumber = rand.nextInt(MAX - MIN + 1) + MIN; // randNumber 将被赋值为一个 MIN 和 MAX 范围内的随机数
    在微软平台下,由于 .Net Framework 提供了相应的方法来生成固定区间的整数,所以公式为:
    // For C#
    int randNumber = rand.Next(MIN, MAX + 1); // randNumber 将被赋值为一个 MIN 和 MAX 范围内的随机数

    ========================================================================================== 我希望每一篇文章的背后,都能看到自己对于技术、对于生活的态度。 我相信乔布斯说的,只有那些疯狂到认为自己可以改变世界的人才能真正地改变世界。面对压力,我可以挑灯夜战、不眠不休;面对困难,我愿意迎难而上、永不退缩。 其实我想说的是,我只是一个程序员,这就是我现在纯粹人生的全部。 ==========================================================================================
  • 相关阅读:
    升级ios 不能连原本的xcode /xcode不能抓帧/换xcode版本 build fail
    BlackBerry Key2 键盘扩展
    再议C风格变量声明
    怎样去除SVN中的某个版本之前的所有版本
    mysql 常用基础语句
    乱码问题
    sql server
    MySQL查询今天、昨天、上周、近30天、去年等的数据的方法
    java 时间转换
    sql server 日期
  • 原文地址:https://www.cnblogs.com/weihuang6620/p/6772891.html
Copyright © 2011-2022 走看看