在javascript中,我有点困惑的是如何获得在数组中混洗对象的实际和准确概率。 例如
var numberOfOrder=[
{
id:1
},
{
id:2
},
{
id:3
}
]
从上面的例子通过查找阶乘numberOfOrder.length;
,可以通过6种方式操作上述对象但是在数组中对该对象进行洗牌的实际方法是什么。
我的尝试
function newShuffle(value) {
for(var i = value.length-1;i >=0; i--){
var randomIndex = Math.floor(Math.random()*(i+1));
var itemAtIndex = value[randomIndex];
value[randomIndex] = value[i];
value[i] = itemAtIndex
}
return value
}
但如果我运行该函数6次返回重复值
,则上述函数将不会返回准确的值这样做的正确功能是什么
答案 0 :(得分:1)
您必须了解概率和排列之间的差异。第二个术语来自组合学。有一些算法可以获得所有可能的数组项排列。这是其中之一:
function permutations(items) {
// single item array - no permutations available
if (items.length == 1) return [items];
var combos = [];
for (var i = 0; i < items.length; i++) {
// first - the current item, rest - array without the current item
var first = items[i], rest = items.slice(0);
rest.splice(i, 1);
// getting permutations of shorter array and for each of them...
permutations(rest).forEach(function(combo){
// prepend the current item
combo.unshift(first);
// save the permutation
combos.push(combo);
});
}
return combos;
}
alert(permutations([ 1, 2, 3 ]).join("\n"));
&#13;
<强>更新强>
上面实现了递归算法。函数permutations
获取一个数组,并以递归方式为每个项目获取以当前项开头的所有排列。在递归的每个步骤中,数组缩短一个项目(减去当前项目),并且在最后一步中没有处理单个元素数组,因为排列不再可用。
还在代码中添加了一些注释。
最后一行只是获取数组[1, 2, 3]
的所有排列并通过alert
显示它们的测试。要获得更多说明性视图,所有找到的排列都会粘贴新的行符号(.join("\n")
)。
答案 1 :(得分:0)
如评论和上述答案所述,您需要排列操作。但是,有许多方法可以获得数组的排列。有关排列的更多信息,我建议您查看Permutations in JavaScript主题。
另一方面,与动态编程方法相比,递归方法总是慢得多。最近我提出了一种排列算法,它似乎是最快的算法。 Check it up