用Mocha和Chai在JavaScript中testing一个随机数函数
假设我有一个函数返回一个乘以二的数字。
function double(number){ return number * 2; }
用摩卡和柴testing它很容易。
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); }); });
但是现在假设我有一个函数返回两个指定整数之间的随机整数,称它们为min
和max
。
function randBetween(min, max){ return Math.floor(Math.random() * (max - min + 1) + min); }
我将无法预测返回的值将等于什么。 我可以编写一个testing,确保返回的值大于或等于min
,小于或等于max
,但实际上并不testing返回的值是否是随机的 。 有一个统计上有效的方法来testing我的randBetween
函数是否正常工作吗?
PS我知道这个函数不处理无效的参数,例如,如果max
小于min
。 请暂时搁置一下。
你不能用一个电话来testing它; 你需要大量的调用来certificate随机性(在一个合理的随机性定义内)。
在大量的电话中,您需要:
- 确保它不会返回超出范围的值
- 确保它在随机性的合理定义范围内提供随机值(因为它是一个确定性的PRNG)
这个问题及其答案是如何去做后者的,尽pipe可以接受的答案中的链接现在大都是死的。
美国国家标准与技术研究院有一个专门针对PRNG的整个部分,包括这个页面描述了几个可以用来确保你回收的随机性的testing 。
当然,如果你的函数是正确实现的(看起来,如果它的意思是返回min <= value < max
就像通常情况下那样),最终你正在testing底层Math.random
实现的随机性。