洗牌算法javascript实现

128 阅读1分钟

时间:2021-12-29 11:14:12

基本原理

洗牌算法是一种将一组数据随机排列的算法,保证每一个元素重新被分配到任何一个位置上的几率都是均等的,是保证随机程度的关键。

image.png

每次随机选取一个数,然后将该数与数组中最后(或最前)的元素相交换(如果随机选中的是最后/最前的元素,则相当于没有发生交换);然后缩小选取数组的范围,去掉最后的元素,即之前随机抽取出的数。重复上面的过程,直到剩余数组的大小为1,即只有一个元素时结束。

完整代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>洗牌算法</title>
</head>

<body>
    <script>
        let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

        document.writeln(arr)
        document.writeln("<p>洗牌算法=></p>")

        function pockerAlgorithm(arr) {
            let len = arr.length
            arr.forEach((item, index) => {
                let max = len - index - 1 // cal max position
                let pos = Math.floor(Math.random() * (max + 1))
                console.log(max + "     " + pos)

                let temp = arr[pos]
                arr[pos] = arr[max]
                arr[max] = temp
            })
            return arr
        }

        document.writeln(pockerAlgorithm(arr) + "<br>")
        document.writeln(pockerAlgorithm(arr) + "<br>")
        document.writeln(pockerAlgorithm(arr) + "<br>")
    </script>
</body>

</html>