Java获取特定区间随机数及产生不重复随机数

Posted okokabcd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java获取特定区间随机数及产生不重复随机数相关的知识,希望对你有一定的参考价值。

问题

有这样一种需求,在这样一个数组中String[] arr = new String[]{"电商", "互联网", "小程序", "网络推广", "文化", "教育", "造型设计", "服装设计"};,随机取n个选项且不重复,n随机且在1-m这个范围之内,其中m是个确定的数且m<=数组长度。

思路

取特定区间的一个随机数

// 从区间[1,4]随机取一个数
Random random = new Random();
int num = random.nextInt(4) + 1;

// 从区间[MIN,MAX]随机取一个数(MAX>MIN,MIN>=0)
Random random = new Random();
int num = random.nextInt(MAX - MIN + 1) + MIN;

// random.nextInt(num)取值范围是 [0,num)

想要从一个长度为M的数组中随机的取其中的N个元素,有两种思路

  1. 产生N个不重复的随机数[0,M-1],根据下标从数组中取值
  2. 将数组内元素顺序打乱,取前N个数,即对前N个数,每个都和元素进行交换,随机么?

思路1

int startArray[] = {0,1,2,3,4,5,6,7,8,9};//seed array    
int N = 10;//随机数个数    
int resultArray[] = new int [10];//结果存放在里面    
for(int i = 0; i < N; i++)    
{    
    int seed = random(0, startArray.length - i);//从剩下的随机数里生成    
    resultArray[i] = startArray[seed];//赋值给结果数组    
    startArray[seed] = startArray[startArray.length - i - 1];//把随机数产生过的位置替换为未被选中的值。    
} 

思路2

// 

解决

Random random = new Random();
int num = random.nextInt(4) + 1;
System.out.println("num:" + num);
String[] arr = new String[]{"电商", "互联网", "小程序", "网络推广", "文化", "教育", "造型设计", "服装设计"};
int len = arr.length;
for (int i = 0; i < num; ++i) {
    int idx = random.nextInt(len - i);
    System.out.println(arr[idx]);
    String tmp = arr[idx];
    arr[idx] = arr[len - i - 1];
    arr[len - i - 1] = tmp;
}

参考

产生N个不重复的随机数的快速算法

以上是关于Java获取特定区间随机数及产生不重复随机数的主要内容,如果未能解决你的问题,请参考以下文章

JS生成不重复的随机数组的简单实例

JAVA中怎么随机产生一个不重复的四位数

java 16 -14 建立产生不重复的限定个数的随机数集合

怎么用Java产生不重复的邀请码

java中产生随机数的函数是啥

JAVA 获取一个四位随机数(并且四位数不重复),并说明原理和算法