JavaScript:洗牌一副牌,但它不会每次使用原始列表创建一副新的洗牌牌

JavaScript:洗牌一副牌,但它不会每次使用原始列表创建一副新的洗牌牌,javascript,arrays,while-loop,shuffle,Javascript,Arrays,While Loop,Shuffle,我正试着洗牌。我拿了一些卡片作为输入。例如,numCards=5,因此组(列表)变为[0,1,2,3,4]。问题是test_order(i,j,l)函数中的while循环没有正确地洗牌。函数控制台.log(m)应使用原始列表(l)打印一个新的洗牌组/列表,但在第一次正确洗牌后,它会继续打印[0,1,2,3,4]。它应该在每次使用原始列表时创建一个新的洗牌组,相反,它会不断重复原始列表或第一个洗牌列表 该程序的目的是找出洗牌后标记为i的牌高于标记为j的牌的次数的概率 function list(n

我正试着洗牌。我拿了一些卡片作为输入。例如,numCards=5,因此组(列表)变为[0,1,2,3,4]。问题是test_order(i,j,l)函数中的while循环没有正确地洗牌。函数控制台.log(m)应使用原始列表(l)打印一个新的洗牌组/列表,但在第一次正确洗牌后,它会继续打印[0,1,2,3,4]。它应该在每次使用原始列表时创建一个新的洗牌组,相反,它会不断重复原始列表或第一个洗牌列表

该程序的目的是找出洗牌后标记为i的牌高于标记为j的牌的次数的概率

function list(numCards){
    var newList = []
    var i = 0;
    while (i < numCards){
        newList.push(i);
        i++;
    }
    return newList
}

function top_to_random(l){
    while(numPerformed != 0){
        var x = Math.floor(Math.random() * l.length);
        l.splice(x, 0, l.shift())
        numPerformed--;
    }
    return l
}

function test_order(i,j,l){ //PROBLEM IS IN HERE!!!!
    var n = 0
    var trials = 10
    var count = 0
    while (count < trials){ // PROBLEM IN WHILE LOOP
        let arrayCopy = JSON.parse(JSON.stringify(l));
        //console.log(arrayCopy)
        var m = top_to_random(arrayCopy)
        m.indexOf(i) < m.indexOf(j) ? n++ : n = n + 0
        
        //console.log(arrayCopy)
        console.log(m)
        count++
    }
    var prob = n/trials
    return  prob
}

//Argument Inputs
var numCards = parseInt(prompt("Enter number of cards in deck: "))
var l = list(numCards)
var numPerformed = parseInt(prompt("Enter number of shuffles to perform on deck: "));
var i = parseInt(prompt("i: "))
var j = parseInt(prompt("j: "))

//Execution
console.log(test_order(i,j,l))
功能列表(numCards){
var newList=[]
var i=0;
而(i
问题不在于你认为它在哪里,而在于你的
top\u to\u random
函数。您可以从
numPerformed
向下计算洗牌中完成的混音数,但这是一个全局范围变量,因此不会在每次调用时重置。应将混合计数作为如下参数传递:

函数top\u to\u random(l,mixNum){
对于(;mixNum>0;mixNum--){
var x=数学地板(数学随机()*l.length);
l、 拼接(x,0,l.shift());
}
返回l;
}
修复了一些语法miconstructs,我得到了以下代码:

功能列表(numCards){
var newList=[];
var i=0;
而(i0;mixNum--){
var x=数学地板(数学随机()*l.length);
l、 拼接(x,0,l.shift());
}
返回l;
}
函数测试的顺序(i,j,l){//这里不存在问题
设n=0;
让试验=10;
对于(让count=0;count日志(测试顺序(i,j,l))问题不在于你认为它在哪里,而在于你的
top\u to\u random
函数。您可以从
numPerformed
向下计算洗牌中完成的混音数,但这是一个全局范围变量,因此不会在每次调用时重置。应将混合计数作为如下参数传递:

函数top\u to\u random(l,mixNum){
对于(;mixNum>0;mixNum--){
var x=数学地板(数学随机()*l.length);
l、 拼接(x,0,l.shift());
}
返回l;
}
修复了一些语法miconstructs,我得到了以下代码:

功能列表(numCards){
var newList=[];
var i=0;
而(i0;mixNum--){
var x=数学地板(数学随机()*l.length);
l、 拼接(x,0,l.shift());
}
返回l;
}
函数测试的顺序(i,j,l){//这里不存在问题
设n=0;
让试验=10;
对于(让count=0;count日志(测试顺序(i,j,l))非常感谢您的详细解释。你能解释一下->让arrayCopy=[…l];do?@newbicoder是应用于数组的扩展运算符,它返回一个克隆数组,例如对包含相同元素的数组的不同引用。非常感谢您的详细解释。你能解释一下->让arrayCopy=[…l];do?@newbicoder是应用于数组的扩展运算符,它返回一个克隆数组,例如,对包含相同元素的数组的不同引用。