算法--生成m个指定范围的不重复随机数的三种方法分析(Java实现)
生活随笔
收集整理的這篇文章主要介紹了
算法--生成m个指定范围的不重复随机数的三种方法分析(Java实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Q題目
如何產生m個在0-N范圍內的無重復的隨機數(不包含N)A解法
2.1 常見解法有兩種:
1.間接獲取--采用隨機下標從已實例化的數組中取元素 2.直接獲取隨機數--然后一一排除2.2 間接法邏輯分析
第一步:將指定范圍內的所有數循環放入數組arr中
第二步:使用隨機下標從該數組中取值,去過的值,賦值為-1
第三步:每次取值時,根據取出來的值是否是 -1來判斷該值是否已經取過
第四步:取過,則重新取值,沒取過,直接拿來用
2.3 直接發邏輯分析
給長度為m的數組arr,依次賦值,每次賦值前,都與前面已經賦值的數進行比較是否重復,若重復,則重復生成隨機數賦值,若不存在,直接賦值。
2.4 兩種方法實現代碼如下
package 隨機不重復數組; //用于產生m個在0-N范圍內的無重復的隨機數(不包含N)import java.util.Arrays;public class Test1 {public static void main(String[] args) {//測試--產生20個在0-30范圍內的無重復的隨機數int num=20;int scope=30;//即取[0,19)中的整數//方法一測試int[] testArr=getRandomArrayByIndex(num, scope);System.out.println("方法一測試結果:"+Arrays.toString(testArr));//方法二測試int[] test2Arr=getRandomArrayByValue(num, scope);System.out.println("方法二測試結果:"+Arrays.toString(test2Arr));}//方法一:間接取值--實例化指定范圍內所有值--再用隨機下標求值//參數說明:num--無重復隨機數的個數 scope--隨機數所在范圍(不包含scope)public static int[] getRandomArrayByIndex(int num,int scope){//1.獲取scope范圍內的所有數值,并存到數組中int[] randomArray=new int[scope];for(int i=0;i<randomArray.length;i++){randomArray[i]=i;}//2.從數組random中取數據,取過后的數改為-1 int[] numArray=new int[num];//存儲num個隨機數int i=0;while(i<numArray.length){int index=(int)(Math.random()*scope);if(randomArray[index]!=-1){numArray[i]=randomArray[index];randomArray[index]=-1;i++;}}return numArray;}//方法二:for循環直接取值public static int[] getRandomArrayByValue(int num,int scope){//創建存儲num個隨機數的數據int[] numArray=new int[num];int lucky;//存生成的隨機數//是否繼續boolean isContinue=true;for(int i=0;i<numArray.length;i++){do {lucky=(int)(Math.random()*scope);//獲得隨機數//判斷數組中是否已經存在了這個隨機數//--存在返回true,重新生成隨機數 --不存在,返回false,停止循環,將該值賦值給數組isContinue=isExistence(numArray, lucky);} while (isContinue);numArray[i]=lucky;}return numArray;}//方法二的輔助方法public static boolean isExistence(int[] numArray,int lucky){for (int i : numArray) {if(i==lucky){//存在返回true--生成新的隨機數,直到隨機數與放入數組numArray中的數不同為止return true;}}return false;} }測試多次結果
方法優劣:
方法一(間接法):比較占內存,每次都需要將所有的隨機數存在一個數組或集合中。但理解簡單,操作簡便。方法二(直接發):占用內存更小,方法簡潔2.5 遞歸解法
邏輯分析:
第一步:直接給采用隨機數賦值–生成一個長度為m的隨機數組arr
第二步:對已經存有隨機數的數組arr,進行去重,重新賦值
優劣:
該方法有許多重復判斷,每次遇到重復的數后,需要將前面的數重新全部判斷一遍是否重復。(不推薦,當然你也可以拿去優化一下)代碼如下:
package 隨機不重復數組;import java.util.Arrays;public class Test2 {public static void main(String[] args) {// 測試--產生15個在0-30范圍內的無重復的隨機數int num = 15;int scope = 30;// 即取[0,19)中的整數// 方法三測試//創建隨機數組:直接賦值隨機數int[] numArray = new int[num];for (int i : numArray) {i = (int) (Math.random() * scope);}int[] test3Arr = isEqual(numArray, scope);System.out.println("方法三測試結果:" + Arrays.toString(test3Arr));}// 方法三:遞歸直接取值public static int[] isEqual(int[] numArray, int scope) {// 獲得隨機數int random = (int) (Math.random() * scope);// 給數組賦值---外層:給數組元素依次賦值for (int i = 1; i <= numArray.length - 1; i++) {// 內層:每次賦值后,與前面的數值進行比較,是否有重復// 若重復,就重新生成隨機數賦值---若無重復,就給下一個數賦值for (int j = 0; j <= i - 1; j++) {// 判斷是否有重復if (numArray[i] == numArray[j]) {// 有重復就重新賦值numArray[i] = random;// 對新賦的值,進行判斷isEqual(numArray, scope);break;}}}return numArray;}}運行結果
總結
以上是生活随笔為你收集整理的算法--生成m个指定范围的不重复随机数的三种方法分析(Java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 漫画说算法--动态规划算法二(绝对通俗易
- 下一篇: 算法--06谷歌面试:字符串中第一个只出