Java 随机数之从指定数据范围内随机选取n个不重复的数据

一、简述

记--从指定数据范围内随机选取n个不重复的数据,如从1~100中随机选取10个数据。

二、效果

三、工程结构

四、源文件

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
import java.lang.Integer;public class RandomTest {static List<Integer> mBaseList = null;//从[minVal, topVal]范围中选出cnt个不重复的数据public static List<Integer> genUniqueRandomVal(int minVal, int topVal, int cnt){int index;int size = topVal-minVal+1;if (minVal >= topVal){return null;}if (cnt>size){return null;}if (null == mBaseList){mBaseList = new ArrayList<Integer>();}//初始化基本数据集合mBaseList.clear();for (int i = minVal; i <= topVal; i++){mBaseList.add(i);}List<Integer> uniqueValList = new ArrayList<Integer>();//无重复的数据集合Random random = new Random();for (; cnt > 0;){index = random.nextInt(size);//范围[0, size)uniqueValList.add(mBaseList.get(index));//添加到数据集合mBaseList.remove(index);//基本数据集合移除已经加到uniqueValList的数据,这样子就不会重复cnt--;size--;}return uniqueValList;}public static void main(String[] args) {System.out.println("Please input min,max,count:");Scanner scan = new Scanner(System.in);//从输入流中获取三个数值int min = Integer.parseInt(scan.next());int max = 0;int cnt = 0;if(scan.hasNext()){max = Integer.parseInt(scan.next());if(scan.hasNext()){cnt = Integer.parseInt(scan.next());List<Integer> list = RandomTest.genUniqueRandomVal(min, max, cnt);for(Integer i : list) {//遍历打印得到的数据集合System.out.print(i+" ");}}}System.out.println("\nFinish.");}}

五、分析

指定范围内的随机数是会有重复的可能,并且小范围多次随机时重复率很高,为了快速生成不重复的随机数,我们需要保证每次得到的随机数是不一样的。如果生成的随机数是重复的,那么再生成一次,直到不重复。这个方法是不可取的,当选取数很接近数据总数时候,重复率是非常大的,如1~100中随机选取99不同的数时,可能需要生成次数远远大于99次,需要消耗很长时间或者几乎不能生成;因此我们采取以下方式:产生的随机数当作是索引,索引对应数据范围的一个数据,每次生成一个随机数就减少一个数据,并且下次随机数生成范围也相应减小,这样需要n个随机数时我们只需要生成n次即可。

如数据源是1 2 3 4 5 6 7 8 9 10     (基本数据集合)

第1次产生随机数范围是1到10,假设第1次产生的随机数是5,把5当作是索引,在基本数据集合中取第5个,并将5移除。

此时数据源变为 1 2 3 4 6 7 8 9 10

第2次产生随机数范围是1到9,假设第2次产生的随机数是8,把8当作是索引,在基本数据集合中取第8个,并将9移除

此时数据源变为 1 2 3 4 6 7 8 10

第3次产生随机数范围是1到8,假设第3次产生的随机数是6,把6当作是索引,在基本数据集合中取第6个,并将7移除

此时数据源变为 1 2 3 4 6 8 10

......

以此类推,直到选取的数据个数等于指定的个数。

注:生成的随机数小于等于基本数据集合的数据个数。

六、附-C语言实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>   //随机生成用到time做种子int INTVALID = -1;//当作是无效的 int* baseArrPtr = NULL;//基本数据数组 //从size大小的arrPtr集合中取第index个数据
int take(int* arrPtr, int size, int index)
{int i, j;if (NULL == baseArrPtr){return  -1;}for (i = 0, j = 0; i<size; i++){if (arrPtr[i] != INTVALID){if (j == index){j = arrPtr[i];arrPtr[i] = INTVALID;return j;}j++;}}return -1;
}//从min到max范围内取cnt个数据并填充到arr
int getUniqueRandomArr(int arr[], int cnt, int min, int max)
{int i, j;int randNum;//随机数 int baseSize = max - min + 1;int tmpSize = baseSize;INTVALID = min - 1;if (min >= max){return -1;}if (cnt>baseSize){return -2;}if (NULL != baseArrPtr){free(baseArrPtr);}//为基本数据数组分配空间 baseArrPtr = (int*)malloc(baseSize*sizeof(int));if (NULL == baseArrPtr){return -3;}//初始化基本数据数组 for (i = 0, j = min; i < baseSize; i++, j++){baseArrPtr[i] = j;}srand(time(0));//设置随机数种子 //rand()%num产生 0~num-1//rand产生范围数公式rand()%(m+1-n)+n;有效范围在 [n,m]for (i = 0; cnt>0; cnt--){randNum = rand() % tmpSize;//randNum的有效范围在 [0,baseSize-1]   arr[i++] = take(baseArrPtr, baseSize, randNum);tmpSize--; }free(baseArrPtr);return i;
}int main(int argc, char *argv[])
{int  i;int min;int max;int cnt;int arr[128] = { 0 };printf("Please input min, max, count:");scanf("%d %d %d", &min, &max, &cnt);getUniqueRandomArr(arr, cnt, min, max);for (i = 0; i<cnt; i++){printf("%d ", arr[i]);}printf("\nFinish.\n");//system("pause");return 0;
}

效果:

Java 随机数之从指定数据范围内随机选取n个不重复的数据相关推荐

  1. Excel如何将同行数据在行内随机排序

    今天跟大家分享一下Excel如何将同行数据在行内随机排序 1.如下图想要将每行数据姓名在行内随机排序即实现随机排班 2.选中E2:G8单元格区域 3.点击下图选项 4.点击[随机重复],[随机排序] ...

  2. 大数据预测实战-随机森林预测实战(三)-数据与特征对模型的影响

    数据与特征对随机森林的影响 带着上节提出的问题,重新读取规模更大的数据,任务还是保持不变,需要分别观察数据量和特征的选寸结果的影响. 导入工具包 import pandas as pd 读取数据 fe ...

  3. 大数据预测实战-随机森林预测实战(三)-数据量对结果影响分析

    下面对比一下特征数量对结果的影响,之前两次比较没有加入新的天气特征,这次把降水.风速.积雪 3 项特征加入数据集中,看看效果怎样∶ # 准备加入新的特征 from sklearn.ensemble i ...

  4. 大数据预测实战-随机森林预测实战(一)-数据预处理

    数据读取 气温预测的任务目标就是使用一份天气相关数据来预测某一天的最高温度,属于回归任务,首先观察一下数据集∶ # 数据读取 import pandas as pdfeatures = pd.read ...

  5. excel删除空行_教你简单小妙招将Excel里重复的数据筛选出来!

    在我们日常工作中,经常会遇到一些重复的数据,但在这些重复的记录里往往只想要报讯一条,因此需要把多余的数据删除.在Excel中,删除重复的数据有两种方法,方法一,是用"删除重复数据删除&quo ...

  6. SQL_删除重复项数据

    -- 全数据查询: SELECT * FROM TLADDING;-- 查询数据表中数据的总条数: SELECT COUNT(*) FROM TLADDING;-- 删除重复项数据的同时保留其中一项作 ...

  7. java 随机数 【指定范围】

    在Java中我们可以使用java.util.Random类来产生一个随机数发生器.它有两种形式的构造函数,分别是Random()和Random(long seed).Random()使用当前时间即Sy ...

  8. JAVA随机数之多种方法从给定范围内随机N个不重复数

    一.JAVA中生成随机数的方式 1.在j2se中使用Math.random()令系统随机选取一个0~1之间的double类型小数,将其乘以一个数,比如25,就能得到一个0~25范围内的随机数,这个在j ...

  9. java文件名大小_java 比较指定文件夹内.txt文件名的大小

    我写了一个程序:每过一定时间向指定文件夹内写一个按时间命名的.txt文件现在想实现最新的txt文件和最原先的txt文件内容比对但是不知道如何获得这两个文家的内容.packagetest;import. ...

  10. java图像处理-(指定区域内)灰度化、透明化(alpha通道)处理

    java图像处理-(指定区域内)灰度化.透明化(alpha通道)处理 2016年07月25日 21:23:16 阅读数:3944 近日在一家小公司实习,老板要求我写一个图形编辑器,其中涉及到用java ...

最新文章

  1. 大三下学期第一周总结
  2. 基于分布式的短文本命题实体识别之----人名识别(python实现)
  3. 51CTO下载IT类/程序类/开发类资源汇总
  4. Android利用RecognizerIntent识别语音并简单实现打电话动作
  5. 深入delphi编程(转)
  6. 不同情况通知执行的顺序
  7. LeetCode 153 寻找旋转排序数组中的最小值
  8. 【技术文档】JEECG整合JXLS步骤与开发
  9. 你真的知道 Python 字符串怎么用吗?
  10. python lambda函数介绍
  11. Windows下安装python的scipy等科学计算包(转)
  12. 关于MyBatis一级缓存、二级缓存那些事
  13. java 抓取搜狗微信_大虾们,求帮助……用httpclient 进行获取微信搜狗公众号文章问题...
  14. 产品经理校招20道常见面试题:问题拆解与回答思路
  15. 全网疯传!最新高频100题汇总(附答案详解)
  16. dwf怎么合成一个_油菜素内酯合成基因DWF1、DET2影响毛白杨木质部形成
  17. 指尖江湖李忘生鸿蒙初开,《剑网3:指尖江湖》李忘生战斗攻略解析
  18. XSS第一节,XSS档案
  19. CoM+日志错误 Help!!!
  20. CC26xx([CortexM3)的Power Reset and Clock

热门文章

  1. python 返回上一级_命令行 返回上一级目录怎么操作
  2. [转载] 百家讲坛——郦波评说曾国藩家训 上部(一)谁来拯救笨小孩
  3. Layui文件下载(VIP典藏版)
  4. 10大H5前端ui框架,ui让你开发不愁
  5. 魔兽TBC常用WA字符串收集
  6. Oracle 数据库(一)—— Oracle 数据库基本介绍
  7. 【渝粤教育】国家开放大学2018年秋季 2517T社区工作 参考试题
  8. 小知识·PD充电协议
  9. Landsat系列卫星数据应用介绍
  10. 负载均衡器-Citrix