求指定范围里的不重复的N个随机数
原本是朋友问了一个题目,怎样把1到25个整形数随机排列,想了想,换个意思就是说如何把25个数随机不重复显示出来,即求1—25中25个随机数的一个数组。最简单的方法即利用双循环,是在每次得到一个随机数后,将该随机数放到结果集数组中去对比,是否存在该数,存在则另外取一个随机数,直到是原本数组中不存在的。
上代码:两循环去重
     public static int[] random(int min,int max,int n){  思想很简单,也容易实现,只需注意一下随机数生成的区间即可
         if(max-min<n || max<min){
             return null;
         }
         int[] result=new int[n];
         Random rand=new Random();
         for(int i=0;i<n;){
             int flag=1;
             int a=rand.nextInt(max-min+1);
             for(int j=0;j<=i;j++){
                 if(result[j]==a){
                     flag=0;
                     break;
                 }
             }
             if(flag==1){
                 result[i++]=a;
             }
         }
         return result;
     }
第二种方法,思想是每取一个数,则将该数剔除随机数选择的区间里面。比如有一个数组,用来存放区间数,然后随机生成一个区间数组里的下标,则将该下标对应的数放到结果数组中,然后令该随机数对应的数替换为区间数组的其他的数,这样每次区间选择的范围则变化,选得数就不会重复。
举一个例子来说,有一个源数组,source[0......24],存放的是要求的区间随机数区间【1.....25】,然后随机生成一个下标在[0...24]的索引数index,将该索引数对应的数放到结果数组result[0],这得到第一个数,然后需要把index对应的数给去除,不能直接说剔除这个索引,这是不现实的,我们做到的是把该值给替换掉。因此,我们拟定一个规则,每次索引随机数对应的值替换成result[length]的值,并且替换后,length--,这样就能保证每次源数组中的值都是没有选到的值。具体见代码。
     public static int[] randomfromArray(int min,int max,int n){
         if(max-min<n || max<min){
             return null;
         }
         int[] source=new int[max-min];    
         int[] result=new int[n];
         int length=max-min+1;        //源数组长度
         for(int i=min;i<min+n;i++){    //得到源数组
             source[i-min]=i;
         }
         Random rd=new Random();
         for(int j=0;j<n;j++){
             int index=rd.nextInt(length--);    //每次随机数索引的选择区域是[0,length),得到后length--,
             result[j]=source[index];        
             source[index]=source[length];     //完成赋值后将index对应的数换掉为length。这样保证每次数更新把最右边的更新到当前被选择的数中。
                               //每次都有数被选中
         }
         return result;
     }
    源数组s[0]=0  s[1]=1  s[2]=2  s[3]=3  s[4]=4  s[5]=5,length=6
    我们假设第一次选得是length-1为索引值,即index为5,那么将s[index]赋给r[0],然后length-1,为5,然后s[5]=s[5],
    s[0]=0 s[1]=1 s[2]=2 s[3]=3 s[4]=4   length=5
    接下来length=5,选择的区间是[0-5),假设index为2,并且length-1,然后r[1]=s[2],然后s[2]=s[length],即s[2]=s[4];
    s[0]=0 s[1]=1 s[2]=4 s[3]=3  length=4
求指定范围里的不重复的N个随机数的更多相关文章
- List<string>里 每个元素重复了多少次
		List<string>里 每个元素重复了多少次 static void Main(string[] args) { List<string> list = new List& ... 
- R语言两种方式求指定日期所在月的天数
		R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ... 
- php判断检测一个数组里有没有重复的值
		php判断检测一个数组里有没有重复的值 php里有一个处理数组重复值得函数array_unique,我们的思路就是用这个函数来实现的. if (count($array) != count(array ... 
- 2017乌鲁木齐区域赛K(容斥原理【求指定区间内与n互素的数的个数】)
		#include<bits/stdc++.h>using namespace std;const long long mod = 998244353;typedef const long ... 
- C#生成指定范围内的不重复随机数
		C#生成指定范围内的不重复随机数 // Number随机数个数 // minNum随机数下限 // maxNum随机数上限 public int[] GetRandomArray(int Number ... 
- js 字符串分割成字符串数组 遍历数组插入指定DOM里 原生JS效果
		使用的TP3.2 JS字符串分割成字符串数组 var images='{$content.pictureurl} ' ;结构是这样 attachment/picture/uploadify/20141 ... 
- poj 1743    二分答案+后缀数组    求不重叠的最长重复子串
		题意:给出一串序列,求最长的theme长度 (theme:完全重叠的子序列,如1 2 3和1 2 3 or 子序列中每个元素对应的差相等,如1 2 3和7 8 9) 要是没有差相等这个条件那就好办 ... 
- Android应用开发基础篇(15)-----URL(获取指定网址里的图片)
		链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2389190.html 一.概述 URL,说白了就是一个网络地址(网址),通常一个网址里包 ... 
- LeetCode  80. Remove Duplicates from Sorted Array II (从有序序列里移除重复项之二)
		Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For exampl ... 
随机推荐
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第五章:排序、分页和路由
			本章的重点是对产品信息增加排序和分页的功能,以及使用ASP.NET Routing特性添加更加友好的URL支持. 注意:如果你想按照本章的代码编写示例,你必须完成第四章或者直接从www.apress. ... 
- 游戏排行榜-Python实现
			背景介绍 排行榜通常是游戏中为了激发玩家的一种策略,那么对于开发人员来说如何完成一个排行榜的设计呢?如果这个排行榜是动态的如何才能高效的对比出结果呢?如果排行榜实时性较高如何给用户展示出用户是进步了还 ... 
- C++ 头文件系列(stack)
			简介 该头文件只含有一个类模版stack, 它实现栈的概念,是一个容器适配器(说实话,在写这篇随笔之前我都不知道有这么个类模版). 栈 栈只有一个重要的特性: LIFO(last-in first-o ... 
- 七、rdd究竟是什么
			RDD是个抽象类,定义了诸如map().reduce()等方法,但实际上继承RDD的派生类一般只要实现两个方法: def getPartitions: Array[Partition] def com ... 
- 用备份控制文件做不完全恢复下的完全恢复(数据文件备份<旧>--新建表空间--控制文件备份<次新>--日志归档文件<新>)
			为什么会使用备份的控制文件? 实际工作中主要有两种情况:第一种:当前控制文件全部损坏,而数据文件备份,控制文件备份及当前日志处于不同SCN版本,它们之间又增加过表空间(数据文件).第二种:当前控制文件 ... 
- 仿qq的侧拉菜单效果
			自定义控件 import android.animation.ArgbEvaluator; import android.animation.FloatEvaluator; import androi ... 
- LR日志解析
			在录制和回放的时候,VU会分别把发生的事件记录成日志文件,这些日志有利于我们跟踪VU和服务器的交互过程. 1.回放日志(Replay log) 脚本回放运行时的输出都记在这个log里. "输 ... 
- 长安大学ACM竞赛部
			本博客为长安大学ACM竞赛部的公共博客,记录长大ACMer的成长点滴. 开此博客,诸君共勉. 
- C语言编程小tip
			1. 随机数产生 int rand(void)产生的随机数每次运行时都是与上一次相同,若要不同,用函数srand()初始化之. void srand(unsigned int seed)初始化随机数发 ... 
- 获取Java的32位MD5实现
			获取Java的32位MD5实现 public static String md5(String s) { char hexDigits[] = {'0','1','2','3','4','5','6' ... 
