[隨機數詳解]生成一個隨機數,生成指定範圍的隨機數及隨機陣列去重

OBKoro1發表於2017-05-09

寫在前面:

很早之前在簡書寫過幾篇關於隨機數的文章之前寫的很亂,現在重新整理一下這些知識點。本文包含了如下這些知識點: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()方法的定義及介紹:

[隨機數詳解]生成一個隨機數,生成指定範圍的隨機數及隨機陣列去重
來自W3C

看完了還是一臉懵逼,到底跟隨機陣列去重有什麼關係??

這裡有一句特別關鍵:

註釋:如果要檢索的字串值沒有出現,則該方法返回 -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

相關文章