使用 Mocha 和 Chai 在 JavaScript 中测试随机数函数
Testing a random number function in JavaScript with Mocha and Chai
假设我有一个函数 returns 一个数乘以二。
function double(number){
return number * 2;
}
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);
});
});
但现在假设我有一个函数 returns 两个指定整数之间的随机整数,称它们为 min
和 max
。
function randBetween(min, max){
return Math.floor(Math.random() * (max - min + 1) + min);
}
我无法预测返回值将等于什么。我可以编写一个测试来确保返回值大于或等于 min
且小于或等于 max
,但实际上并没有测试返回值是否为 [=32] =]随机。是否有统计上有效的方法来测试我的 randBetween
函数是否正常工作?
P.S。我知道该函数不处理无效参数,例如如果 max
小于 min
。请暂时搁置。
你不能一次调用就测试它;您将需要大量调用来证明随机性(在随机性的合理定义范围内)。
在大量来电中,你会想:
- 确保它不会 return 值超出范围
- 确保它确实在随机性的合理定义范围内提供随机值(假定它是确定性 PRNG)
This question and its answers 进入如何做后者,虽然遗憾的是接受的答案中的链接现在大部分都死了。
美国国家标准与技术研究院有一整节专门介绍 PRNG,包括 this page describing several tests 您可以用来确保返回内容的随机性。
当然,如果你的函数实现正确(而且看起来是,如果它意味着 return min <= value < max
通常情况下),最终你正在测试的随机性底层 Math.random
实现。
假设我有一个函数 returns 一个数乘以二。
function double(number){
return number * 2;
}
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);
});
});
但现在假设我有一个函数 returns 两个指定整数之间的随机整数,称它们为 min
和 max
。
function randBetween(min, max){
return Math.floor(Math.random() * (max - min + 1) + min);
}
我无法预测返回值将等于什么。我可以编写一个测试来确保返回值大于或等于 min
且小于或等于 max
,但实际上并没有测试返回值是否为 [=32] =]随机。是否有统计上有效的方法来测试我的 randBetween
函数是否正常工作?
P.S。我知道该函数不处理无效参数,例如如果 max
小于 min
。请暂时搁置。
你不能一次调用就测试它;您将需要大量调用来证明随机性(在随机性的合理定义范围内)。
在大量来电中,你会想:
- 确保它不会 return 值超出范围
- 确保它确实在随机性的合理定义范围内提供随机值(假定它是确定性 PRNG)
This question and its answers 进入如何做后者,虽然遗憾的是接受的答案中的链接现在大部分都死了。
美国国家标准与技术研究院有一整节专门介绍 PRNG,包括 this page describing several tests 您可以用来确保返回内容的随机性。
当然,如果你的函数实现正确(而且看起来是,如果它意味着 return min <= value < max
通常情况下),最终你正在测试的随机性底层 Math.random
实现。