RT
// 数组arr,每次随机选择一个元素,不能重复选择,最终全部输出
let arr = [1,2,3,4,5,6,7,8,9]
<!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>
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
2 回答4.2k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
3 回答2.7k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
4 回答2.5k 阅读✓ 已解决
算法步骤:
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...