寫在前面:
很早之前在簡書寫過幾篇關於隨機數的文章之前寫的很亂,現在重新整理一下這些知識點。本文包含了如下這些知識點:js生成隨機數,生成指定範圍的隨機數,獲得不重複隨機陣列。
js生成隨機數。
Math.random()——生成大於等於0.0且小於1.0的一個隨機數;
通常我們生成隨機數都是使用這個方法,這個方法返回值是一個偽隨機選擇的數,該值大於等於0.0且小於1.0,即取值範圍是[0.0,1.0)的左閉右開區間,在該範圍內(近似)均勻分佈。
下面有張動態圖栗子,可以看一下。
Math.floor(Math.random()*20)——取0~20之間的隨機整數:
Math.floor(x)——使後面括號內的x(任意數值或表示式),生成一個小於等於 x,且與 x 最接近的整數。
Math.floor(x),可以簡單理解為下舍入。這裡有幾個栗子幫助理解,//後面是輸出的內容:
document.write(Math.floor(0.60) + "<br />")//0
document.write(Math.floor(0.40) + "<br />")//0
document.write(Math.floor(5) + "<br />")//5
document.write(Math.floor(5.1) + "<br />")//5
document.write(Math.floor(-5.1) + "<br />")//-6
document.write(Math.floor(-5.9))//-6複製程式碼
解析上面Math.floor(Math.random()*20)的栗子:
1.通過Math.random()生成0-1之間的隨機數
2.然後乘以20,就是取從0~20間的隨機數,注意這裡並不是整數。這裡的範圍可以改變,只要改後面那個數字為50,、8,就可以變成0~50,0~80之間的隨機數。
3.Math.floor(),使括號裡面的(Math.random()乘以20)這個表示式,下舍入,生成為一個整數。
上面兩個方法的demo動態圖。
文末有demo連結,可以把程式碼複製回去,自己試試
生成指定範圍的隨機數(從任意值到任意值)
這裡是從任意值開始,我們剛才取的隨機數都是從0開始。但是有些場景可能需要我們取一個指定範圍的隨機數,比如20-30,80-120等等。
這裡有一個公式:Math.floor(Math.random()*(max-min+1)+min);
ps: max - 範圍內的最大值,min - 單位內的最小值
按照這個公式來,就沒錯了,下面是demo栗子。
值得注意的是:
如果是負數範圍的隨機數,要進行符號轉換的,比如--30(這裡是說減去三十。),轉換符號後變成+。不轉換符號,會出現報錯!
Math.floor(Math.random()*(-10--30+1)+-30)//錯誤
Math.floor(Math.random()*(-10+30+1)-30);//正確。複製程式碼
生成指定範圍的隨機數的栗子:
獲得不重複的隨機陣列。
獲得不重複隨機陣列的方法非常多,這裡就介紹一種:使用indexOf()的方法來去重,然後通過push()方法來新增陣列。
push() 方法的作用:
push() 方法可向陣列的末尾新增一個或多個元素,並返回新的長度。
indexOf()方法的定義及介紹:
看完了還是一臉懵逼,到底跟隨機陣列去重有什麼關係??
這裡有一句特別關鍵:
註釋:如果要檢索的字串值沒有出現,則該方法返回 -1。
依靠這句註釋,通過if條件判斷,我們就可以做出隨機陣列去重的功能。
程式碼:
//num是一個陣列,randomNum是一個隨機數值。
while (num.length<3){//num.length代表陣列的長度,當陣列的長度不再滿足小於3,跳出迴圈
var randomNum=Math.floor(Math.random()*9);//獲得在0-9之間的隨機數
if (num.indexOf(randomNum)<0){
//判斷randomNum之前有沒有在陣列裡面,如果沒有,就新增進去,如果有,重新迴圈。
num.push(randomNum);
// 將randomNum這個隨機數,新增到num這個陣列裡面。
}
console.log(num);
}複製程式碼
程式碼思路:
1.先限定陣列的長度,否則就成死迴圈了。
2.獲得一個隨機數
3.判斷是否已經在陣列裡面,如果沒有,就執行if下面的函式。
4.沒有出現這個隨機數,indexOf()這個方法會返回-1,這是判斷條件的依據。
5.當隨機數達到三個了就跳出迴圈。此時num陣列已經去重完畢。
程式碼執行演示:
以下是演示的一個栗子,當陣列裡面已經有6了,再隨機到6的時候,就會跳過push,直到隨機到不重複的。
ps:indexOf()這個方法去重效率到後期偏低,僅適用於資料量比較小的時候,因為後期資料量大的話,陣列中每一個都進行依次比較的話,時間方面會花很長時間。
文中出現栗子的:demo連結
以上就是本文介紹的一些隨機數的知識點。
最後:如需轉載,請放上原文連結並署名。碼字不易,感謝支援!因為我經常看不懂別人寫的分享,所以個人寫文比較偏小白,寫的不好之處,歡迎指點。然後就是希望看完的朋友點個喜歡,也可以關注一下我。
ps:目前待業,座標北京,本人適應網際網路快節奏,高強度,持續學習,持續成長,認真,嚴謹,學習積極性強。中小公司大佬求帶走,郵箱:1677593011@qq.com。
掘金個人主頁
2017.5.9