Javascript 如何测试随机输出?

Javascript 如何测试随机输出?,javascript,unit-testing,testing,random,Javascript,Unit Testing,Testing,Random,下面的代码用于玩彩票游戏 let Lotto = { _nMap: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 ], _

下面的代码用于玩彩票游戏

let Lotto = {
    _nMap: [
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
    ],
    _sMap: [
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
    ],

    /**
     * @param {Array} shuffleArr
     *
     * @return {Array}
     */
    _shuffleArr(shuffleArr) {
        let rndNr, tmpValue;

        for (let elmNr = shuffleArr.length - 1; elmNr > 0; elmNr--) {
            rndNr = Math.floor(
                Math.random() * (elmNr + 1)
            );

            tmpValue = shuffleArr[rndNr];

            shuffleArr[rndNr] = shuffleArr[elmNr];
            shuffleArr[elmNr] = tmpValue;
        }

        return shuffleArr;
    },

    /**
     * @return {Object}
     */
    getPick() {
        return {
            n: this._shuffleArr(this._nMap).slice(0, 5),
            s: this._shuffleArr(this._sMap).slice(0, 2)
        }
    }
};

现在我想验证实现是否正确。例如:它应该返回一组唯一的数字。我如何测试这个?运行.getPick()方法一次并验证输出,或者…?

您可以编写一个测试用例,比如让脚本运行10到15次,然后将值放入数组中并查找模式。像这样的东西会很好:

让乐透={
_nMap:[
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
],
_sMap:[
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
],
/**
*@param{Array}shufflear
*
*@return{Array}
*/
_洗牌耳环{
设rndNr,tmpValue;
对于(让elmNr=shufflearl.length-1;elmNr>0;elmNr--){
rndNr=Math.floor(
Math.random()*(elmNr+1)
);
tmpValue=shufflear[rndNr];
洗牌耳环[rndNr]=洗牌耳环[elmNr];
shufflearl[elmNr]=tmpValue;
}
回程耳环;
},
/**
*@return{Object}
*/
getPick(){
返回{
n:这个._shufflear(这个._nMap).slice(0,5),
s:这个._shufflear(这个._sMap).slice(0,2)
}
}
};
var分录=[];
对于(变量i=0;i<100;i++)
entries.push(JSON.stringify(Lotto.getPick());
变量计数={};
对于(变量i=0;i75)
警报(“超过75%的唯一性”);
其他的

警报(“少于75%唯一”)您可以编写一个测试用例,比如让脚本运行10到15次,然后将值放入数组中并查找模式。像这样的东西会很好:

让乐透={
_nMap:[
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50
],
_sMap:[
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
],
/**
*@param{Array}shufflear
*
*@return{Array}
*/
_洗牌耳环{
设rndNr,tmpValue;
对于(让elmNr=shufflearl.length-1;elmNr>0;elmNr--){
rndNr=Math.floor(
Math.random()*(elmNr+1)
);
tmpValue=shufflear[rndNr];
洗牌耳环[rndNr]=洗牌耳环[elmNr];
shufflearl[elmNr]=tmpValue;
}
回程耳环;
},
/**
*@return{Object}
*/
getPick(){
返回{
n:这个._shufflear(这个._nMap).slice(0,5),
s:这个._shufflear(这个._sMap).slice(0,2)
}
}
};
var分录=[];
对于(变量i=0;i<100;i++)
entries.push(JSON.stringify(Lotto.getPick());
变量计数={};
对于(变量i=0;i75)
警报(“超过75%的唯一性”);
其他的

警报(“少于75%唯一”)
See我得到了正确的输出,但是我需要用一个测试用例来验证它。你有没有尝试过
javascript
at stacksnippets at Answer?See我得到了正确的输出,但是我需要用一个测试用例来验证它。你有没有尝试过答案的stacksnippets上的
javascript
?@43a7898a80上面的代码片段做了100次,并验证它没有重复。。。你可以运行它十几次,因为它也很好。你想接受这个答案吗?你可以点击勾选按钮,谢谢。在我的例子中,我调整了单元测试,因为生成行的顺序并不重要。现在我知道数据是随机的,或者至少是这个案例中随机的定义。但现在我还没有验证每个序列是否包含相同的数字。所以我创建了另一个测试来验证这一点,但我应该运行十几次还是…?我问这个问题是因为它也不可能针对所有可能的结果运行,因为有数百万。@43a7898a80是的,我更喜欢100次。我不认为你需要更多的东西才能得到一只害群之马<代码>:)
是的,谢谢!注:有2 118 760种可能性。当使用的序列是唯一的且顺序不重要时,进行映射。当一个数字被声明两次时,只有1924180个可能性,其中17296个可能有2个相同的数字。因此,您应该至少运行1924 180/17 296=112次测试。当然,你可能不会每次都达到这个速率,所以你应该把它乘以几倍。当我运行测试2240次时,测试在40分钟内每次都发现了错误。然后我停了下来:-)@43a7898a80上面的代码片段做了100次,并验证它没有重复。。。你可以运行它十几次,因为它也很好。你想接受这个答案吗?你可以点击勾选按钮,谢谢。在我的例子中,我调整了单元测试,因为生成行的顺序并不重要。现在我知道数据是随机的,或者至少是这个案例中随机的定义。但现在我还没有验证每个序列是否包含相同的数字。所以我创建了另一个测试来验证这一点,但我应该运行十几次还是…?我问这个问题是因为它也不可能针对所有可能的结果运行,因为有数百万。@43a7898a80是的,我更喜欢100次。我不认为你需要更多的东西才能得到一只害群之马<代码>:)是的,谢谢!注:有2 118 760种可能性。当使用的序列是唯一的且顺序不重要时,进行映射。当一个数字被声明两次时,只有1924180个可能性,其中17296个可能有2个相同的数字。因此,您应该至少运行1924 180/17 296=11测试