javascript - 从源数字数组中提取随机数的最佳方法是什么,直到源数组中没有唯一值?
问题描述
我需要创建一个 makeRandom 函数,它接受一系列数字作为数组,其中第一个数字是范围的开始,第二个是结束,包括该范围内的这个数字。这个函数的结果应该是一个函数,并且调用从范围内返回一个随机数。返回的数字必须是唯一的。如果我用完了唯一编号,则必须返回 null。
它应该像这样工作:
const getRandom = makeRandom([1, 5]);
getRandom() === 3
getRandom() === 4
getRandom() === 5
getRandom() === 2
getRandom() === 1
getRandom() === null
getRandom() === null
所以我尝试了:
function makeRandom(numbers) {
return () => {
let randNumber = Math.floor(Math.random() * numbers.length);
for (let i = 0; i < numbers.length; i++) {
randNumber += numbers[i];
if (randNumber === numbers[i]) {
return true;
}
if (randNumber === numers[i].length) {
return true;
}
}
if (!numbers) {
return null;
}
};
}
但它不起作用。那么最好的方法是什么?
解决方案
如果数组有长度或返回,您可以添加数组中的所有值并拼接数组null
。
const
makeRandom = ([min, max]) => {
const values = [];
while (min <= max) values.push(min++);
return () => values.length
? values.splice(Math.floor(Math.random() * values.length), 1)[0]
: null;
},
getRandom = makeRandom([1, 5]);
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
推荐阅读
- reactjs - 如何正确输入 React.Children 和 React.cloneElement?
- sql - 对两个 SQL 表进行分组和求和,并替换缺失值
- javascript - 如何在画布中显示几个不同的图像?
- direct3d - Direct3D 9 Z-Buffer Precision Bug 仅在发布版本中出现
- texas-instruments - 有没有办法在 TI-Basic 的分屏模式下绘制 2 个不同的东西?
- reactjs - React 获取和显示数据问题
- javascript - 将信息从数组移动到另一个工作表时遇到问题
- windows - 如何检查是否启用了使用管理员帐户登录?
- python - 无法弄清楚如何通过套接字发送 2D 数组 - OSError: [WinError 10022]
- typescript-typings - 打字稿:评估泛型函数的类型