js中如何优雅的随机依次输出数组中的元素

RT

// 数组arr,每次随机选择一个元素,不能重复选择,最终全部输出
let arr = [1,2,3,4,5,6,7,8,9]
阅读 4.6k
4 个回答
Fisher–Yates shuffle 洗牌算法:
是一个用来将一个有限集合生成一个随机排列的算法(数组随机排序)。这个算法生成的随机排列是等概率的,同时这个算法非常高效。

算法步骤:
1.写下从 1 到 N 的数字
2.取一个从 1 到剩下的数字(包括这个数字)的随机数 k
3.从低位开始,得到第 k 个数字(这个数字还没有被取出),把它写在独立的一个列表的最后一位
4.重复第 2 步,直到所有的数字都被取出
5.第 3 步写出的这个序列,现在就是原始数字的随机排列

迭代思路:
每次迭代时交换这个被取出的数字到原始列表的最后,故算法时间复杂度减少为O(n)
————————————————
版权声明:本文为CSDN博主「wszhou1997」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wszhou1...
image.png

let randInt=(m,n)=>Math.floor(Math.random() * (m - n + 1)) + n;

let arr = [0,1,2,3,4,5,6,7,8,9];
let n = arr.length;
for (let i = 0 ; i < n; i++) {
    // 从 i 到最后随机选一个元素
    let rand = randInt(i, n - 1);
    [arr[i],arr[rand]]=[arr[rand],arr[i]]
}
console.log(arr);
VM359:10 (10) [3, 5, 1, 8, 7, 0, 4, 2, 9, 6]
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h1></h1>

    <button onclick="randomValue()">随机</button>
    <script>
      const data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
      const wrap = document.querySelector('h1')
      const selected = []

      function randomValue() {
        let res
        const randomArr = arr => arr[Math.floor(Math.random() * arr.length)]

        if (!selected.length) {
          res = randomArr(data)
          selected.push(res)
        } else if (selected.length === data.length) {
          res = '随机完毕'
        } else {
          const arr = data.filter(v => !selected.includes(v))
          res = randomArr(arr)
          selected.push(res)
        }

        wrap.innerText = res
      }
    </script>
  </body>
</html>

Math.random + array.splice

先打乱后取出

let arr = [1,2,3,4,5,6,7,8,9];
arr.sort(() => Math.random() - 0.5);
// 之后遍历
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题