2017-07-08 118 views
2

假設我有一個函數返回一個乘以2的數字。使用Mocha和Chai在JavaScript中測試隨機數函數

function double(number){ 
    return number * 2; 
} 

要使用Mocha測試和Chai容易。

var expect = require("chai").expect; 

describe("#double", function(){ 
    it("should double a number", function(){ 
    expect(double(2)).to.equal(4); 
    expect(double(4.5)).to.equal(9); 
    expect(double(-3)).to.equal(-6); 
    }); 
}); 

但現在假設我有一個返回兩個指定整數之間的隨機整數的函數,叫他們minmax

function randBetween(min, max){ 
    return Math.floor(Math.random() * (max - min + 1) + min); 
} 

我無法預測返回值會等於什麼。我可以編寫一個測試,確保返回值大於或等於min且小於或等於max,但實際上並不測試返回值是否爲隨機。有沒有統計上有效的方法來測試我的randBetween函數是否正常工作?

P.S.我知道這個函數沒有處理無效的參數,例如如果max小於min。請暫時擱置一邊。

回答

2

你不能用一次調用來測試它;你需要大量的調用來證明隨機性(在一個合理的隨機性定義內)。

在大量的電話,你會想:

  1. 確保它不會返回值超出範圍
  2. 確保它的隨機性的一個合理的定義中提供的隨機值(因爲它是一個確定性的PRNG)

This question and its answers進入如何做後者,雖然可悲的是接受的答案中的鏈接現在大多已經死亡。

美國國家標準與技術研究院有專門的PRNGs,包括this page describing several tests,你可以用它來確保你找回的隨機性。

當然,如果你的函數是正確實現的(而且它看起來像是通常情況下返回min <= value < max),那麼最終你會測試底層Math.random實現的隨機性。

相關問題