在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次返回重复值,则上述函数将不会返回准确值
正确的功能是什么
您必须了解概率和排列之间的区别。第二个术语来自组合语。有一些算法可以获取数组项的所有可能排列。这是其中之一:
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"));
更新
递归算法在上面实现。该函数permutations
获取一个数组,并为每个项目递归获取从当前项目开始的所有排列。在递归的每个步骤中,数组都缩短一个项目(减去当前项目),而在最后一步,由于无法再使用置换,因此不处理单个元素数组。
还向代码添加了一些注释。
最后一行只是测试,以获取数组的所有排列[1, 2, 3]
并通过显示它们alert
。为了获得更好的说明性视图,所有找到的排列都用换行符号(.join("\n")
)粘贴。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句