java生成指定范围随机数的多种代码
作者:mdxy-dxy 发布时间:2023-04-28 07:51:15
生成指定范围内的随机数这个是最常用的技术之一,程序员希望通过随机数的方式来处理众多的业务逻辑,测试过程中也希望通过随机数的方式生成包含大量数字的测试用例。
问题往往类似于:
如何随机生成 1~100 之间的随机数,取值包含边界值 1 和 100。
或者是:
如何随机生成随机的3位整数?
等等……
以 Java 语言为例,我们观察其 Random 对象的 nextInt(int) 方法,发现这个方法将生成 0 ~ 参数之间随机取值的整数。例如(假设先有 Random rand = newRandom();,下同):
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 个取值。
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);
}
}
}
同理,很容易知道如果要获得随机两位整数,代码写成: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 范围内的随机数
下面脚本之家小编分享一个网上常用的函数
函数一、要生成在[min,max]之间的随机整数
import java.util.Random;
public class RandomTest {
public static void main(String[] args) {
int max=20;
int min=10;
Random random = new Random();
int s = random.nextInt(max)%(max-min+1) + min;
System.out.println(s);
}
}
random.nextInt(max)表示生成[0,max]之间的随机数,然后对(max-min+1)取模。
以生成[10,20]随机数为例,首先生成0-20的随机数,然后对(20-10+1)取模得到[0-10]之间的随机数,然后加上min=10,最后生成的是10-20的随机数
函数二、
import java.util.*;
import java.io.*;
public class Random_Different {
public static void main(String[] args) throws IOException{
System.out.print("输入产生的随机数范围,1到N,N=");
int n=0;
try{
n=Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
}catch(Exception e){
System.out.println("N必须为正整数");
return;
}
if(n<1){
System.out.println("N必须为正数");
return;
}
int randArr[]=new int[n];
int i=0;
while(i<n){
int rand=(new Random().nextInt(n)+1);
boolean isRandExist=false;
for(int j=0;j<randArr.length;j++){
if(randArr[j]==rand){
isRandExist=true;
break;
}
}
if(isRandExist==false){
randArr[i]=rand;
i++;
}
}
System.out.println(Arrays.toString(randArr));
}
}
首先在1~n产生一个随机数X,然后对这个之前产生的数据进行遍历,判断是否存在有数等于这个新产生的随机数的,如果有,立flag,
然后对之前的数据遍历完毕之后,判断flag是否立起来,
如果是,就不添加这个随机数进数组,重新产生随机数并收起flag,再重新遍历已有的数据中是否已有这个随机数,
如果否,就添加,直到n个数据产生完毕。
最后输出这个n个数据。
具体的运行效果如下:
为了说明这个程序是健壮的,让电脑输入N,其中这个N从1-20,可以观察到,输出的数组中没有一个数是相同的,完成任务!
更多的数也是没有问题的,你设置N=二十万,都没有问题,这里由于本猿猴的机器太渣,设置个N=33说明效果。
猜你喜欢
- 启动第二个服务时就会报如下的错误:Server failed to start for port 8080: Address already
- 目录一、图示二、链表的概念及结构三、单链表的实现四、完整代码的展示一、图示二、链表的概念及结构 链表是一种物理存储结构上非连续存储结构,数据
- iOS定位 - 普通定位(没有地图) - 反地理编码(得到具体位置),下面通过代码给大家详解,代码如下:#import <CoreLo
- 排查@CacheEvict注解失效我简单看了一下《Spring实战》中的demo,然后就应用到业务代码中了,本以为如此简单的事情,竟然在代码
- 对象创建的几种方法:使用new关键字使用clone方法反射机制反序列化以上四种都可以产生java对象1,3都会明确的显式的调用构造函数2是在
- 在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小。这个该如何实现呢?通过读取文件&q
- 一、什么是状态管理大到整个app的状态,用户使用app是登录状态,还是游客状态;小到一个按钮的状态,按钮是点击选中状态还是未点击状态等等,这
- 一、简介Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供
- java读写ini文件、FileOutputStream在上课让学生练习文件读写,就让他们做了一个使用文件保存账号和密码的练习,有一个比较爱
- 本文实例为大家分享了C#超市收银系统设计的具体代码,供大家参考,具体内容如下1.登录界面代码如下:using System;using Sy
- 一、SpringBoot 指定配置文件路径:在 SpringBoot 中,可以将配置文件放在 jar 包外面,这样可以方便地修改配置而不需要
- 一、项目概述之前有不少粉丝私信我说,能不能用Android原生的语言开发一款在手机上运行的游戏呢?说实话,使用java语言直接开发游戏这个需
- 1.多数元素题目描述思路详解这个思路比较简单,先排序,排序过后遍历如果后一个等于前一个输出就好代码与结果class Solution { &
- springboot集成 redispom文件<dependency> <groupId>
- 代码如下所示:package com.hoo.util; import java.awt.Color; import
- 文章来源:csdn 作者:chensheng913对于Java语言,最体贴的一项设计就是它并没有打算让人们为了写程序而写程序——人们也需要考
- 前言开篇一个例子,我看看都有谁会?如果不会的,或者不知道原理的,还是老老实实看完这篇文章吧。@Slf4j(topic = "c.V
- 上一篇JavaMail入门第四篇 接收邮件中,控制台打印出的内容,我们无法阅读,其实,让我们自己来解析一封复杂的邮件是很不容易的,邮件里面格
- Spring Boot 的启动原理可以概括为以下几个步骤:加载 Spring Boot 应用程序的启动类根据启动类所在的包路径扫描相关的类根
- (一) collection和collections这两者均位于java.util包下,不同的是:collection是一个集合接口,有Li