参见英文答案 > Generate unique number within range (0 – X), keeping a history to prevent duplicates 4个
我使用以下代码从指定范围获取随机值
var provideRanges = function(){
var aa = [];
_.times(3, function(i) {
console.log(i);
let num = _.random(10, 20)
console.log("num = :" + num)
debugger;
aa.push(num);
console.log("value is :" + aa[i]);
});
}
当你调用这个函数时,这是工作并提供指定范围之间的3个值的数组,但是如果我再次调用它,那么这里的问题变得更加困难忽略从提供的数字中排除先前提供的数字(如果它下次不提供这些数字时提供10,11,12 ……),有没有更好的方法呢?我尝试使用recoursive调用但迷路:(,任何想法怎么做?
解决方法:
一种方法是创建一个数组来存储现有的选择,将所选元素推送到一个数组,检查数组是否包含该元素,以及存储值.length的数组是否大于或等于最大范围减去最小范围.
从问题描述中不清楚,一旦范围内的所有元素都被归还,应该发生什么?
var range = [10, 20];
var not = [];
function randomRange(range, n) {
if (not.length >= range[1] - range[0]) {
return "all numbers in range used"
}
var curr = [];
var res = [];
for (let i = range[0]; i < range[1]; i++) {
if (!not.some(function(num) {
return i == num
}) && not.length < range[1] - range[0]) {
curr.push(i)
}
}
for (let i = 0; i < n; i++) {
var j = curr.splice(Math.floor(Math.random() * curr.length), 1)[0];
res[i] = not[not.length] = j;
}
return res.filter(Boolean)
}
console.log(randomRange(range, 3));
console.log(randomRange(range, 3));
console.log(randomRange(range, 3));
console.log(randomRange(range, 3));
console.log(randomRange(range, 3));