JavaScript:洗牌一副牌,但它不会每次使用原始列表创建一副新的洗牌牌
我正试着洗牌。我拿了一些卡片作为输入。例如,numCards=5,因此组(列表)变为[0,1,2,3,4]。问题是test_order(i,j,l)函数中的while循环没有正确地洗牌。函数控制台.log(m)应使用原始列表(l)打印一个新的洗牌组/列表,但在第一次正确洗牌后,它会继续打印[0,1,2,3,4]。它应该在每次使用原始列表时创建一个新的洗牌组,相反,它会不断重复原始列表或第一个洗牌列表 该程序的目的是找出洗牌后标记为i的牌高于标记为j的牌的次数的概率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
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是应用于数组的扩展运算符,它返回一个克隆数组,例如,对包含相同元素的数组的不同引用。