如何在不获取javascript重复值的情况下获得洗牌的概率

时间:2016-12-19 07:00:50

标签: javascript arrays probability

在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次返回重复值

,则上述函数将不会返回准确的值

这样做的正确功能是什么

2 个答案:

答案 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;
&#13;
&#13;

<强>更新

上面实现了递归算法。函数permutations获取一个数组,并以递归方式为每个项目获取以当前项开头的所有排列。在递归的每个步骤中,数组缩短一个项目(减去当前项目),并且在最后一步中没有处理单个元素数组,因为排列不再可用。

还在代码中添加了一些注释。

最后一行只是获取数组[1, 2, 3]的所有排列并通过alert显示它们的测试。要获得更多说明性视图,所有找到的排列都会粘贴新的行符号(.join("\n"))。

答案 1 :(得分:0)

如评论和上述答案所述,您需要排列操作。但是,有许多方法可以获得数组的排列。有关排列的更多信息,我建议您查看Permutations in JavaScript主题。

另一方面,与动态编程方法相比,递归方法总是慢得多。最近我提出了一种排列算法,它似乎是最快的算法。 Check it up