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个不重复的随机数的快速算法

原文地址:https://www.cnblogs.com/okokabcd/p/9056017.html

时间: 2024-11-13 06:38:12

Java获取特定区间随机数及产生不重复随机数的相关文章

java 获取时间区间

package com.javaCode.package05; import java.text.*; import java.util.*; public class Sd123 { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) throws Exception { MyDate m = new MyDa

java 获取特定天数的时间戳

1 public Timestamp strToDate(int type){ 2 Timestamp time = null; 3 DateFormat format2= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 4 Date date = null; 5 Calendar cale = Calendar.getInstance(); 6 cale.add(Calendar.DATE, type); 7 String tarday =

Java获取随机数的3种方法(转)

方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math.random()*(10-1+1)) 从1到10的int型随数 方法2 获得随机数 for (int i=0;i<30;i++) {System.out.println((int)(1+Math.random()*10));} (int)(1+Math.random()*10) 通过java.Math包的random方法得到1-10的int随机数 公式是:最小值---最大值(整数)的

Java获取随机数的3种方法

方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1))例:(int)(1+Math.random()*(10-1+1))从1到10的int型随数 方法2获得随机数for (int i=0;i<30;i++){System.out.println((int)(1+Math.random()*10));}(int)(1+Math.random()*10)通过java.Math包的random方法得到1-10的int随机数公式是:最小值---最大值(整数)的随机数(类型)最小

Java获取随机数的3种方法和总结

方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math.random()*(10-1+1)) 从1到10的int型随数 方法2 获得随机数 for (int i=0;i<30;i++) {System.out.println((int)(1+Math.random()*10));} (int)(1+Math.random()*10) 通过java.Math包的random方法得到1-10的int随机数 公式是:最小值---最大值(整数)

JAVA获取随机数

在Java中我们能够使用java.util.Random类来产生一个随机数发生器.它有两种形式的构造函数,各自是Random()和Random(long seed).Random()使用当前时间即System.currentTimeMillis()作为发生器的种子,Random(long seed)使用指定的seed作为发生器的种子. 随机数发生器(Random)对象产生以后,通过调用不同的method:nextInt().nextLong().nextFloat().nextDouble()等

获取10个1-20之间的随机数,要求不能重复

package cn; import java.util.ArrayList; import java.util.Random; /**  * 获取10个1-20之间的随机数,要求不能重复  *   * 用数组实现,但是数组的长度是固定的,长度不好确定.  * 所以我们使用集合实现.  *   * 分析:  *  1.创建产生随机数的对象  *      2.创建一个存储随机数的集合  *      3.定义统计变量,从0开始,是否小于10  *       是 : 先产生一个随机数,判断该随机

Java获取用户的输入

Java获取用户的输入可以使用Scanner和流的方式,在这里我介绍两种方法 1.使用Scanner import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()) { System.out.println("输出:"+sc.next()); } } } 使用Scann

【ArrayList:获取 10 个 1-20 之间的随机数,要求不能重复】

package com.companyname.common.test; import java.util.ArrayList; import java.util.Random; /** * @Description 获取 10 个 1-20 之间的随机数,要求不能重复 * @Author Created by shusheng. * @Email [email protected] * @Date 2018/12/14 */ public class RandomDemo { public s