數組操作在所有的語言中,都占有一個很重要的位置,比如,生成一定數量的不重復的隨機數。關於生成隨機數的問題,可以應用在比如等概率抽獎等相關功能。本篇文章就記錄兩個比較不錯的生成隨機數的方法。
生成隨機數的方法應該是有很多的,這裡隻說明兩種我認為比較好的方法吧:
方法1:利用數組操作實現
1:生成一個數組集合arr1,數組長度為取值范圍,最小值為arr1[0] = 0;
2:定義一個空數組res = [],用來存儲最後生成的隨機數組。
3:根據arr1的長度,生成一個隨機值,len = Math.floor(arr1.length*Math.random()),這個值在arr1數組中,肯定會有一個對應的數組。
4:從arr1數組中,取出第len個元素,arr1[len],並且把取出的該值,保存到res數組中,res.push(arr1[len]);
5:在arr1數組中,刪除第len個元素,使得新的數組,不再含有arr1[len]這個數值
6:循環,從第三步進行下一輪的循環,直到res數組的長度等於num時(最後需要的隨機數的個數),結束循環。
7:輸出res,即為一個隨機的數組。
代碼:
function createRandomNumber_1(num, maxNum) { if (!maxNum || !num) { alert("please input two Number"); return false; } var flag = 0, i = 0, arrLen = 0, ran = 0, arr = [], res = []; if (maxNum - num < 0) { flag = maxNum; maxNum = num; num = flag; } for (; i < maxNum; i++) { arr[i] = i - 0 + 1; } arr.length = maxNum; flag = 0; while (num > flag) { arrLen = arr.length; ran = Math.floor(arrLen * Math.random()); res.push(arr.splice(ran, 1)[0]); flag++; } return res; }
方法2:巧用JS原生的API實現生成隨機數
1:生成一個數組集合arr:,數組長度為取值范圍,最小值為arr[0] = 0;
2:使用sort方法,對arr進行一個隨機排序。
3:arr.length限制arr的長度
4:輸出arr,即為生成的隨機數。
代碼:
function createRandomNumber_2(num, maxNum) { if (!maxNum || !num) { alert("please input two Number"); return false; } var flag = 0, i = 0, arr = []; if (maxNum - num < 0) { flag = maxNum; maxNum = num; num = flag; } for (; i < maxNum; i++) { arr[i] = i - 0 + 1; } arr.sort(function(p1, p2) { return 0.5 - Math.random(); }); //上面這段代碼,就是該思想的核心。 arr.length = num; return arr; }
這個方法,是再別處看到的,當時給我的印象簡直太大的瞭,從來沒有想象到,還可以這樣實現,很好很強大。
該方法的帖子:js隨機生成0-51之間30個不同的數字,以前也在CSDN上,寫過一篇:在一定范圍內,隨機生成N個不等的數組。
測試一下吧
范圍數表示隨機數的可選擇范圍,選擇數為最後生成隨機數的個數
註:請保證范圍數的數值,要大於選擇數的數值
註:如果想要看性能時間問題,可以把范圍數設置大於10000,選擇數大於100就能很明顯的看出優劣瞭。