algorithm - 无重复结果的随机发生器
问题描述
我需要将数字从low
到high
随机放入一个数组中。
例如给出:low = 10, high = 15 一个喜欢的结果[ 12, 13, 10, 14, 11]
是好的。
这是一个简单的算法:从低到高迭代并尝试填充数组上的空槽。
const low = 1000
const high = 1010
const diff = high - low
const arr = new Array(diff)
for (var i = low; i < high; i++) {
let success = false
while(!success) {
const index = Math.floor(Math.random() * diff)
if (arr[index] === undefined) {
arr[index] = i
success = true
}
console.log(`${index} was ${success ? 'available' : 'taken'}`)
}
}
console.log(arr)
问题是:在大部分元素都被填满的地方,很难在数组中找到一个未被占用的槽。
我的问题是:是否有一种算法可以不断生成唯一的新数字,直到所有数字都被消耗完?
另一种思考方式是一种算法,它以最有效和最快的方式对数组进行洗牌。
解决方案
与其生成“随机”数字,不如生成一个数字列表并使用类似Fisher-Yates Shuffle 之类的东西“随机”打乱它:
function getRandomArray(min, max) {
return shuffle([...Array(max - min).keys()].map(i => i + min));
}
function shuffle(array) {
var m = array.length, t, i;
while (m) {
i = Math.floor(Math.random() * m--);
t = array[m];
array[m] = array[i];
array[i] = t;
}
return array;
}
var randomArr = getRandomArray(10, 15);
console.log(randomArr);
推荐阅读
- c++ - std::cout 不打印我想要的内容?
- c# - 我正在尝试将网格数据导出为 CSV,但未显示 Audiofilename 列数据
- java - 如果 2 TextView 在 ConstraintLayout 中有长文本,如何缩小第一个 TextView 而不是第二个?
- actions-on-google - 如何将 Google Assistant Action 迁移到 SDK 和平台的 V3?
- javascript - 如何在 vue.js 中导入 ipcRenderer?__dirname 未定义
- javascript - 即使在冒泡阶段,Mousedown 事件也会改变子元素的颜色
- python - 日志模块无法加载好的配置
- azure - 用于 blobstorage 帐户的操作 Azure CDN 配置
- c++ - 使用工厂函数创建 std::shared_ptr
- python - 如何在每个带有类名的标签之后插入新元素?