java⽣成指定范围随机数的多种代码
⽣成指定范围内的随机数这个是最常⽤的技术之⼀,程序员希望通过随机数的⽅式来处理众多的业务逻辑,测试过程中也希望通过随机数的⽅式⽣成包含⼤量数字的测试⽤例。
问题往往类似于:
如何随机⽣成 1~100 之间的随机数,取值包含边界值 1 和 100。
或者是:
如何随机⽣成随机的3位整数?
等等……
以 Java 语⾔为例,我们观察其 Random 对象的 nextInt(int) ⽅法,发现这个⽅法将⽣成 0 ~ 参数之间随机取值的整数。例如(假设先有 Random rand = newRandom();,下同):
这⾏代码将⽣成范围0~100 之间的随机数,有趣的是,取值可能为 0 ,但不可能为 100。我们⽤中学数
学课学习的区间表⽰法,表⽰为:[0, 100)。
那么如果要获得区间 [1~100]的随机数,该怎么办呢?稍微动动脑筋就可以想到:区间 [0, 100) 内的整数,实际上就是区间 [0, 99]。因为最⼤边界为100,可惜不能等于100,因此最⼤可能产⽣的“整数”就是99。
既然Int(100) 获得的值是区间 [0, 99],那么在这个区间左右各加 1,就得到了区间 [1, 100]。因此,代码写成:
即可。运⾏下⾯的代码,将获得 [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.Int(100) + 1);
}
}
}
同理,很容易知道如果要获得随机两位整数,代码写成:Int(90) + 10;
你⼀定很惊讶,为什么是这么写出来的。其实,在 nextInt() ⽅法中作为参数的数字 90 表⽰:你希望⽣成的随机数的所有取值的可能性的数量(在本命题中,两位整数取值为 [10, 99],共90个数);加好后⾯的数字 10 ,表⽰区间的最⼩取值。
你可以验证下,按照这样理解,[1, 100] 的随机数,是不是应该写成Int(100) + 1 。千万不要把参数 100 理解为最⼤取值。只是区间 [1, 100] 正好从 1 开始,所以最⼤取值和取值可能性数量正好同为 100。
因此,
⽣成随机三位数的代码为:
⽣成区间 [64,128] 中随机值的代码为:
取值可能性的数量是如何计算出来的呢?当然是最⼤取值-最⼩取值+1 ,所以,有最终公式如下:
// For Java
int randNumber =Int(MAX - MIN + 1) + MIN; // randNumber 将被赋值为⼀个 MIN 和 MAX 范围内的随机数
下⾯⼩编分享⼀个⽹上常⽤的函数
函数⼀、要⽣成在[min,max]之间的随机整数java生成随机数的方法
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 = Int(max)%(max-min+1) + min;
System.out.println(s);
}
}
以⽣成[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.String(randArr));
}
}
⾸先在1~n产⽣⼀个随机数X,然后对这个之前产⽣的数据进⾏遍历,判断是否存在有数等于这个新产⽣的随机数的,如果有,⽴flag,
然后对之前的数据遍历完毕之后,判断flag是否⽴起来,
如果是,就不添加这个随机数进数组,重新产⽣随机数并收起flag,再重新遍历已有的数据中是否已有这个随机数,
如果否,就添加,直到n个数据产⽣完毕。
最后输出这个n个数据。
具体的运⾏效果如下:
为了说明这个程序是健壮的,让电脑输⼊N,其中这个N从1-20,可以观察到,输出的数组中没有⼀个数是相同的,完成任务!
更多的数也是没有问题的,你设置N=⼆⼗万,都没有问题,这⾥由于本猿猴的机器太渣,设置个N=33说明效果。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论