生活随笔
收集整理的這篇文章主要介紹了
JAVA随机数之多种方法从给定范围内随机N个不重复数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、JAVA中生成隨機數的方式
?
???? 1、在j2se中使用Math.random()令系統隨機選取一個0~1之間的double類型小數,將其乘以一個數,比如25,就能得到一個0~25范圍內的隨機數,這個在j2me中沒有;????
Java代碼??
int?randomNumber?=?(int)?Math.round(Math.random()*(max-min)+min);?? ?
???? 2、在System類中有一個currentTimeMillis()方法,這個方法返回從1970年1月1號0點0分0秒到目前的一個long型的毫秒 數,可作為一個隨機數,還可以將其對某些數取模,就能限制隨機數的范圍;此方式在循環中同時產生多個隨機數時,會是相同的值,有一定的局限性! ?
Java代碼??
long?randomNum?=?System.currentTimeMillis();??int?randomNumber?=?(int)?randomNum%(max-min)+min;?? ?
???? 3、使用java.util.Random類來產生一個隨機數發生器,這個也是我們在j2me的程序里經常用的一個取隨機數的方法。它有兩種形式的構造函 數,分別是Random()和Random(long seed)。Random()使用當前時間即System.currentTimeMillis()作為發生器的種子,Random(long seed)使用指定的seed作為發生器的種子。隨機數發生器(Random)對象產生以后,通過調用不同的method:nextInt()、 nextLong()、nextFloat()、nextDouble()等獲得不同類型隨機數。 如果兩個Random對象使用相同的種子(比如都是25),并且以相同的順序調用相同的函數,那它們返回值完全相同。????
Java代碼??
Random?random?=?new?Random();??int?randomNumber?=??random.nextInt(max)%(max-min+1)?+?min;?? ?
?
二、隨機給定范圍內N個不重復的數
?
??? 1、方法一:最簡單最易理解的兩重循環去重??
Java代碼??
public?static?int[]?randomCommon(int?min,?int?max,?int?n){??????if?(n?>?(max?-?min?+?1)?||?max?<?min)?{?????????????return?null;?????????}??????int[]?result?=?new?int[n];??????int?count?=?0;??????while(count?<?n)?{??????????int?num?=?(int)?(Math.random()?*?(max?-?min))?+?min;??????????boolean?flag?=?true;??????????for?(int?j?=?0;?j?<?n;?j++)?{??????????????if(num?==?result[j]){??????????????????flag?=?false;??????????????????break;??????????????}??????????}??????????if(flag){??????????????result[count]?=?num;??????????????count++;??????????}??????}??????return?result;??}?? ????
??? 2、方法二:利用HashSet的特征,只能存放不同的值??
Java代碼??
???public?static?void?randomSet(int?min,?int?max,?int?n,?HashSet<Integer>?set)?{?????????if?(n?>?(max?-?min?+?1)?||?max?<?min)?{?????????????return;?????????}?????????for?(int?i?=?0;?i?<?n;?i++)?{????????????????????????int?num?=?(int)?(Math.random()?*?(max?-?min))?+?min;?????????????set.add(num);???????}?????????int?setSize?=?set.size();????????????????if?(setSize?<?n)?{??????????randomSet(min,?max,?n?-?setSize,?set);???????}?????}?? ?
???? 3、方法三:排除已隨機到的數??
Java代碼??
public?static?int[]?randomArray(int?min,int?max,int?n){??????int?len?=?max-min+1;????????????if(max?<?min?||?n?>?len){??????????return?null;??????}????????????????int[]?source?=?new?int[len];?????????for?(int?i?=?min;?i?<?min+len;?i++){??????????source[i-min]?=?i;?????????}??????????????????int[]?result?=?new?int[n];?????????Random?rd?=?new?Random();?????????int?index?=?0;?????????for?(int?i?=?0;?i?<?result.length;?i++)?{?????????????????????index?=?Math.abs(rd.nextInt()?%?len--);????????????????????????result[i]?=?source[index];????????????????????????source[index]?=?source[len];?????????}?????????return?result;??}?? ??
??? 調用實例:
Java代碼??
????public?static?void?main(String[]?args)?{??????int[]?reult1?=?randomCommon(20,50,10);??????for?(int?i?:?reult1)?{??????????System.out.println(i);??????}????????????int[]?reult2?=?randomArray(20,50,10);??????for?(int?i?:?reult2)?{??????????System.out.println(i);??????}????????????HashSet<Integer>?set?=?new?HashSet<Integer>();??????randomSet(20,50,10,set);?????????for?(int?j?:?set)?{??????????System.out.println(j);??????}??} ?
總結
以上是生活随笔為你收集整理的JAVA随机数之多种方法从给定范围内随机N个不重复数的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。