2017-07-08 116 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实现的随机性。

相关问题