我需要将low
到high
的数字随机排列在一个数组中。
例如,给定:低= 10,高= 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)
问题是:在大多数元素都被填充到最后时,很难在数组中找到空闲的插槽。
我的问题是:是否有一种算法会不断生成唯一的新数字,直到所有数字都被消耗掉?
另一种思考方式是一种以最有效,最快的方式对数组进行混洗的算法。
答案 0 :(得分:4)
不是生成“随机”数字,而是使用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);
答案 1 :(得分:0)
Fisher-Yates Shuffle的另一种实现方式:
const low = 1000
const high = 1010
const delta = high - low
const arr = [...new Array(delta)]
arr.forEach((value, index, arr) => arr[index] = index + low)
const result = []
while (arr.length > 0) {
const index = Math.floor(Math.random() * arr.length)
result.push(arr[index])
arr.splice(index, 1)
}
console.log(result)
答案 2 :(得分:0)