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

如何在javascript中获得在不获得重复值的情况下洗牌数组的概率,javascript,arrays,probability,Javascript,Arrays,Probability,在javascript中,我有点困惑如何获得在数组中洗牌对象的实际和准确概率。 比如说 var numberOfOrder=[ { id:1 }, { id:2 }, { id:3 } ] 从上面的例子中,通过找到阶乘numberOfOrder.length,可以以6种方式操纵上述对象 但在数组中洗牌该对象的实际方式是什么 我的尝试 function newShuffle(value) { for(var i = value.len

在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次,返回重复的值,那么上面的函数将不会返回准确的值


正确的函数是什么?你必须理解概率和排列之间的区别。第二项来自组合学。有一些算法允许获得数组项的所有可能排列。以下是其中之一:

函数置换(项){
//单项数组-没有可用的排列
如果(items.length==1)返回[项目];
var组合=[];
对于(变量i=0;i警报(排列([1,2,3])。连接(“\n”)如注释和上述答案所述,您需要排列操作。然而,有许多方法可以获得数组的排列。关于排列的更多信息,我建议你们看看这个主题


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

你说“不会返回准确值”是什么意思?
Math.random
函数和获取所有可能的数组项排列之间没有关系。那么,得到这样一个好答案的实际方法是什么呢?但是你能附上一些参考资料吗?函数的作用是什么?因为我是javascript新手