日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

算法--生成m个指定范围的不重复随机数的三种方法分析(Java实现)

發布時間:2025/3/20 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法--生成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实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。