原本是朋友问了一个题目,怎样把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个随机数的更多相关文章

  1. List<string>里 每个元素重复了多少次

    List<string>里 每个元素重复了多少次 static void Main(string[] args) { List<string> list = new List& ...

  2. R语言两种方式求指定日期所在月的天数

                 R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ...

  3. php判断检测一个数组里有没有重复的值

    php判断检测一个数组里有没有重复的值 php里有一个处理数组重复值得函数array_unique,我们的思路就是用这个函数来实现的. if (count($array) != count(array ...

  4. 2017乌鲁木齐区域赛K(容斥原理【求指定区间内与n互素的数的个数】)

    #include<bits/stdc++.h>using namespace std;const long long mod = 998244353;typedef const long ...

  5. C#生成指定范围内的不重复随机数

    C#生成指定范围内的不重复随机数 // Number随机数个数 // minNum随机数下限 // maxNum随机数上限 public int[] GetRandomArray(int Number ...

  6. js 字符串分割成字符串数组 遍历数组插入指定DOM里 原生JS效果

    使用的TP3.2 JS字符串分割成字符串数组 var images='{$content.pictureurl} ' ;结构是这样 attachment/picture/uploadify/20141 ...

  7. poj 1743 二分答案+后缀数组 求不重叠的最长重复子串

    题意:给出一串序列,求最长的theme长度 (theme:完全重叠的子序列,如1 2 3和1 2 3  or  子序列中每个元素对应的差相等,如1 2 3和7 8 9) 要是没有差相等这个条件那就好办 ...

  8. Android应用开发基础篇(15)-----URL(获取指定网址里的图片)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2389190.html 一.概述 URL,说白了就是一个网络地址(网址),通常一个网址里包 ...

  9. LeetCode 80. Remove Duplicates from Sorted Array II (从有序序列里移除重复项之二)

    Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For exampl ...

随机推荐

  1. RabbitMQ Exchange类型详解

    前言 在上一篇文章中,我们知道了RabbitMQ的消息流程如下: 但在具体的使用中,我们还需知道exchange的类型,因为不同的类型对应不同的队列和路由规则. 在rabbitmq中,exchange ...

  2. C语言之分支结构 if(一)

    一 程序的三种基本结构 顺序结构:程序从上往下依次执行,这个叫顺序结构 分支结构:有选择的执行或者不执行某段代码 循环结构:重复的执行某段代码 二 分支结构之if 最简单的俩种用法 (tips: if ...

  3. D3.js:完整的柱形图

    一个完整的柱形图包含三部分:矩形.文字.坐标轴.本章将对前几章的内容进行综合的运用,制作一个实用的柱形图,内容包括:选择集.数据绑定.比例尺.坐标轴等内容. (1) 添加SVG画布 //画布大小 va ...

  4. 数据库开启gtid时,需要注意的问题

    1.slave不能执行任何sql,包括超级用户2.read_only=on,这个必须要开启,避免业务执行sql3.保证当前slave的事务id为1 当slave同步出现问题时,手动跳过,需要考虑的问题 ...

  5. 如何通过fpmmm和zabbix来监控客户机上MariaDB数据库运行情况

    首先在客户机安装MariaDB和zabbix,参考上一篇 安装fpmmm的过程主要参考[1]. 安装fpmmm的依赖 shell> yum install php-cli php-process ...

  6. netty高级篇(3)-HTTP协议开发

    一.HTTP协议简介 应用层协议http,发展至今已经是http2.0了,拥有以下特点: (1) CS模式的协议 (2) 简单 - 只需要服务URL,携带必要的请求参数或者消息体 (3) 灵活 - 任 ...

  7. System.Data.DbType和数据库映射关系

    有如下类型的映射对照: System.Data.SqlClient.SqlDbType  System.Data.OleDb.OleDbType System.Data.Odbc.OdbcType S ...

  8. 简易富文本编辑器bootstrap-wysiwyg源码注释

    好久没写随笔了,因为最近比较忙,小公司基本都是一个前端干所有属于和部分不属于前端的事情,所以就没空弄了,即使想分享,也因为没有时间和精力就搁置了. 这周周六日休息,正好时间比较充裕(ps:目前处在单休 ...

  9. 对于行高(line-height)的一些理解

    刚一开始学习这个特性的时候,总是出一些当时看起来很奇怪的问题.现在决定重新整理一下.毕竟使用css,十行揉在一起凑出效果是一种使用,知道为什么会有这种效果也是一种使用.我们需要做一些测试,所以首先需要 ...

  10. SpringMVC同时使用<mvc:resources … />和日期转换Formatter时出现问题的解决方法

    很久没更新博文了,不是没有学习,而是很多东西记在OneNote里面,收获很多啊,因为各种杂事,所以对于博客很久没更新了. 个人觉得:博客比起OneNote或者为知笔记之类的云笔不同在于博客应该记载的是 ...