JavaScript用Math.random()生成隨機數

2020-12-22 青石野草

1. 基本概念

顧名思義,Math.random()方法就是用於生成隨機數的,因為單詞random的意思正是「隨機的」。該方法生成的結果是 [0, 1) 範圍內的浮點數,注意這是一個左閉右開的區間,即該區間包含0而不包含1。

官方文檔指出Math.random()方法生成的隨機數在該區間上要大致符合均勻分布。Math.random()的語法結構如下所示,可以看出它是沒有參數的。

Math.random();

JavaScript引擎會自動設置隨機數種子(seed),而沒有提供任何途徑讓我們自己來完成這件事,但某些其它語言(比如C++,Java)則通常允許用戶自主設置隨機數種子。

2. 範圍放縮

Math.random()方法的一個不足之處就是它只能隨機生成 [0, 1) 範圍內的數,而我們常常又需要其它範圍內的隨機數。其實這也不難,只要對Math.random()的結果進行適當的放縮就可以達到這一目的。為了敘述方便,在後面的說明中我們都約定n和m代表正整數且m大於n。

首先,假設我們需要隨機生成 [0, n) 之間的所有數,那麼只需將Math.random()的結果乘以n就可以了,正如下面的代碼所做的那樣。

其次,我們可能需要的是隨機生成 [0, n] 範圍內的整數,注意此時n也包含在生成結果中。我們先將Math.random()的結果乘以 n+1,得到 [0, n+1) 範圍內的浮點數。然後,再對該範圍內的數進行向下取整(使用Math.floor()方法)就可以得到 [0, n] 範圍內的整數了。

以上兩種方法生成的隨機數都是從0開始的,如果我們需要的是任意區間的隨機數呢?假設我們需要隨機生成 [n, m] 範圍內的整數,那麼我們先隨機生成 [0, m - n] 範圍內的整數,再將它加上n就可以得到 [n, m] 內的整數了。

用相同的思想,可以將Math.random()的結果放縮到任意區間,當然也包括負數的情況。

3. 示例

3.1 生成隨機數

我們首先來看下Math.random()的作用和隨機生成一個任意區間內的整數的情況,以下代碼的執行結果如圖1所示。

圖1 隨機數的生成

3.2 隨機數的分布

官方文檔中說Math.random()的結果要大致符合均勻分布,我們現在就通過一個實例來看一看。在該例子中,我們先隨機生成1億個 [1, 10] 範圍內的整數,再計算每個數出現的比例。

以上代碼的執行結果如圖2所示,正是因為Math.random()符合均勻分布而我們自定義的隨機數函數又是建立在Math.random()上的,所以我們的隨機數函數生成的隨機數也是均勻分布的。

圖2 隨機數的分布情況

(完)

相關焦點

  • java生成隨機數的五種方法
    Math.random() 靜態方法產生的隨機數是 0 - 1 之間的一個 double,即 0 <= random <= 1。當第一次調用 Math.random() 方法時,自動創建了一個偽隨機數生成器,實際上用的是 new java.util.Random()。當接下來繼續調用 Math.random() 方法時,就會使用這個新的偽隨機數生成器。
  • 前端:用javascript實現一個轉盤小遊戲?
    實現轉盤邏輯由於轉盤的轉動是隨機的,所以我們需要每次點擊開始按鈕都要隨機生成一個角度,但是仔細分析一些平臺會發現轉盤每次都至少轉動n圈後才會慢慢開始停下,所以我們會給轉盤一個初始的角度,比如720deg,1080deg,這樣能保證轉盤至少轉動n圈才停下來。
  • 區塊鏈中隨機數的實現
    當我們談論計算機系統中的隨機性時,我們真正指的是偽隨機性,即儘可能模擬出現實世界應有的隨機性,使之近乎於「真正的隨機性」。以密碼學安全偽隨機數生成器為例,這是一個非常強大的隨機性模擬。隨機數在隱私技術和密碼學中發揮著重要作用。令人驚豔的是,通過生成一個隨機數來對一條消息進行運算(XOR),提供了一種簡單但十分強大的加密方案。
  • 如何利用代碼生成一個隨機數?
    ②新建隨機數(Random)對象。格式:類名 對象名=new 類名(參數)。參數表示隨機數的範圍,比如參數為10即表示10以內(不包括10)的隨機數,100即表示100以內(不包括100)的隨機數。③調用隨機數(Random)成員方法。
  • 什麼是JavaScript對象?如何創建並引用?這就告訴你!
    javascript的對象的鍵值可以是任何數據類型。():隨機函數(0-1)floor():向下取整ceil():向上取整round():四省五入取整pow():求一個數的冪數max():求最大值min():求最小值
  • Python中random庫的使用
    random庫是計算機中用於生成隨機數的標準庫。基本隨機數函數:seed( )、random( ) 擴展隨機數函數:randint( )、getrandbits( )、uniform( )、 randrange( )、choice( )、shuffle( )
  • 隨機和偽隨機 電腦隨機數是如何生成的?
    隨機和偽隨機 電腦隨機數是如何生成的?要理解為什麼這種隨機數不太可靠,你必須理解隨機數的生成原理。  隨機數的作用  隨機數的使用歷史已經有數千年。無論是拋硬幣還是搖色子,目的是讓隨機概率決定結果。電腦中的隨機數生成器的目的也是如此——生成隨機不可預測的結果。  加密法要求數字不能被攻擊者猜到,不能多次使用同樣的數字。
  • 《面試又翻車了》這次竟然和 Random 有關?
    正文Random 是使用最廣泛的隨機數生成工具了,即使連 Math.random() 的底層也是用 Random 實現的 源碼如下:Math.random()Math.random()Random.nextDouble
  • Excel生成隨機數的技巧,隨機數發生器,你用過嗎
    商業分析中的很多應用要求從特定的概率分布中隨機抽樣。例如,在財務模型中,當銷售額、銷量增長幅度、運營支出和通貨膨脹因子等全都不確定時,我們可能對累積的貼現現金流的分布感興趣,而這一分布可以用概率分布來描述。那些決策模型的結果變量,是隨機輸入變量的複雜函數。要理解這些變量的概率分布,只有藉助所謂蒙特-卡羅方法的抽樣流程才能實現這一抽樣流程。
  • python隨機模塊22個函數詳解(上)
    random模塊,用於生成偽隨機數,之所以稱之為偽隨機數,是因為真正意義上的隨機數(或者隨機事件)在某次產生過程中是按照實驗過程中表現的分布概率隨機產生的,其結果是不可預測的,是不可見的。而計算機中的隨機函數是按照一定算法模擬產生的,對於正常隨機而言,會出現某個事情出現多次的情況。
  • 機器學習十大經典算法之隨機森林
    隨機森林簡介隨機森林是機器學習一種常用的方法。它是以決策樹為基礎,用隨機的方式排列建立的,森林裡每個決策樹之間都是沒有關聯的。算法流程隨機森林裡每棵樹按照如下規則生成:1、如果訓練集大小為N,對於每棵樹而言,隨機且有放回地從訓練集中的抽取N個訓練樣本,作為該樹的訓練集;PS:從這裡我們可以知道:每棵樹的訓練集都是不同的
  • 單片機C語言如何產生隨機數
    或者預先寫好一個隨機數表,然後進行取數據。也是可以的。C語言提供了一些庫函數來實現隨機數的產生。,分別為 rand函數、random函數、randomize 函數,但是rand函數產生的並不是真意正義上的隨機數,是一個偽隨機數,是根據一個數,稱之為種子,為基準以某個遞推公式推算出來的一係數,當這系列數很大的時候,就符合正態公布,從而相當於產生了隨機數。
  • Flutter開發 dart:math函數學習 Android和IOS都可學習 建議收藏
    import 'dart:math';數學常數和函數,加上隨機數生成器。首先看看三角學(trigonometry)數學的一門分科,包括平面三角學和球面三角學。平面三角學研究三角函數的性質和圖象、三角函數式的恆等變換、解三角形等。球面三眾學研究球面三角形的邊角關係,以及由球面三角形的三個巳知基本元素,計算它的未知基本元素的問題。
  • 偽隨機數發生器:你不知道,其實計算機並不能產生隨機數
    在生活中,我們需要用到隨機數的地方很多,例子也很好舉,比如我們買彩票的號碼就是一個隨機數。但是當計算機中需要產生隨機數的時候,絕大多數情況下並不是真的隨機數,我們把它稱為偽隨機數。這些偽隨機數是在一定的數值範圍內,採用一定的算法挑選出了一個數字,作為隨機產生的結果顯示出來,我們只能夠儘量讓這個算法公平一些,讓挑選到範圍內每一個數字的概率儘量做到一樣大,這樣產生的結果會更接近隨機數。如果大家對編程有一些基礎的話,那麼對於rand()函數或者random()函數就不會陌生,這兩個函數都是用來產生偽隨機數的,要設定一個隨機種子(數值形式)來讓函數產生偽隨機數。
  • 量子真隨機數發生器研究取得進展
    超高速真隨機數發生器簡化設計方案(上)與後處理方法(下)信息科學技術學院郭弘教授課題組與物理學院張建瑋副教授課題組開展合作,在用光學隨機源設計研製量子真隨機數發生器的研究中取得重要進展 近期,郭弘課題組已在真隨機數發生器研究領取得了一系列研究成果。例如,通過對離散型和連續型量子隨機源的持續研究,在隨機源的建模分析、信號採集手段、數據後處理方法和隨機性統計檢測等方面均形成理論和技術的積累。
  • 真隨機數發生器在信息安全系統中的應用
    整個系統的安全性完全依賴於隨機數序列的生成效率和質量。  圖1示例是一個隨機數發生器在安全控制器內部的典型應用,隨機數被用來產生動態密鑰對數據總線和外設寄存器進行動態加密,使得在CPU和外設間實現數據加密傳輸,整個過程沒有明文存在。
  • 跟我學解Python題-隨機數列表去重
    明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了N個1~1000 之間的隨機整數(N<=1000),N是用戶輸入的,對於其中重複的數字,只保留一個,把其餘相同的數字去掉,不同的數對應著不同的學生的學號,然後再把這些數從小到大排序,按照排好的順序去找同學做調查,請你協助明明完成
  • 密碼學的骰子——隨機數
    我們在平時編程開發裡用到的隨機數,一般都只滿足第一個條件,這種只滿足隨機性分布的隨機數,就叫做偽隨機數或弱偽隨機數。這是因為程式語言提供的隨機數生成方法(學名叫偽隨機數生成器)是靠軟體算法實現的,既然是算法,那就必定遵循了一定的規律,也就有被預測的可能。
  • 下一代Tor通信將用分布式隨機數生成器加密
    當前,由於TOR(洋蔥網絡)的通信安全性不斷受到挑戰,TOR項目團隊開始為下一代的洋蔥路由網絡尋找新的加密途徑,例如在隨機數字的生成方面。TOR項目團隊開始為下一代的洋蔥路由網絡尋找新的加密途徑  在通信安全領域,由於要生成隨機、不可預測的加密密鑰,因此對於隨機數的應用是必不可少的。