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

寫在前面:

很早以前在簡書寫過幾篇關於隨機數的文章以前寫的很亂,如今從新整理一下這些知識點。本文包含了以下這些知識點:js生成隨機數,生成指定範圍的隨機數,得到不重複隨機數組。javascript

js生成隨機數。

Math.random()——生成大於等於0.0且小於1.0的一個隨機數;

一般咱們生成隨機數都是使用這個方法,這個方法返回值是一個僞隨機選擇的數,該值大於等於0.0且小於1.0,即取值範圍是[0.0,1.0)的左閉右開區間,在該範圍內(近似)均勻分佈html

下面有張動態圖栗子,能夠看一下。java

Math.floor(Math.random()*20)——取0~20之間的隨機整數:

Math.floor(x)——使後面括號內的x(任意數值或表達式),生成一個小於等於 x,且與 x 最接近的整數git

Math.floor(x),能夠簡單理解爲下舍入。這裏有幾個栗子幫助理解,//後面是輸出的內容:github

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連接,能夠把代碼複製回去,本身試試dom

生成指定範圍的隨機數(從任意值到任意值)

這裏是從任意值開始,咱們剛纔取的隨機數都是從0開始。可是有些場景可能須要咱們取一個指定範圍的隨機數,好比20-30,80-120等等函數

這裏有一個公式:Math.floor(Math.random()*(max-min+1)+min);

ps: max - 範圍內的最大值,min - 單位內的最小值學習

按照這個公式來,就沒錯了,下面是demo栗子。ui

值得注意的是:

若是是負數範圍的隨機數,要進行符號轉換的,好比--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

相關文章
相關標籤/搜索