如何从JavaScript中的数字数组生成非重复随机数?
设arr=[2,3,5,7,9] arr[Math.floor(Math.random()*arr.length)]如何从JavaScript中的数字数组生成非重复随机数?,javascript,arrays,Javascript,Arrays,设arr=[2,3,5,7,9] arr[Math.floor(Math.random()*arr.length)] arr[Math.floor(Math.random()*arr.length)]/5 arr[Math.floor(Math.random()*arr.length)]//2 arr[Math.floor(Math.random()*arr.length)]/9 arr[Math.floor(Math.random()*arr.length)]/9 9在此重复,如何确保随机数
arr[Math.floor(Math.random()*arr.length)]/5
arr[Math.floor(Math.random()*arr.length)]//2
arr[Math.floor(Math.random()*arr.length)]/9
arr[Math.floor(Math.random()*arr.length)]/9
9在此重复,如何确保随机数从不重复。解决方案1-检查是否重复
var最小值=0;
var最大值=100;
风险值数值_至_生成=10;
//确保要生成的数字<(最大数字-最小数字+1);
var数=[];
while(numbers.length<要生成的数字){
var number=Math.floor(Math.random()*(max_number-min_number))+min_number;
if(number.indexOf(number)=-1){
数字。推(数字);
}
}
控制台日志(编号);
解决方案2-从数字池中随机获取
var最小值=0;
var最大值=100;
风险值数值_至_生成=10;
//确保要生成的编号<(最大编号-最小编号)
var数=[];
var pool=Array.from(新数组(max_number-min_number),(x,i)=>i+min_number);
while(numbers.length<要生成的数字){
var number=pool.splice(Math.floor(Math.random()*(pool.length-1)),1)[0];
数字。推(数字);
}
控制台日志(编号);
解决方案1-检查是否重复
var最小值=0;
var最大值=100;
风险值数值_至_生成=10;
//确保要生成的数字<(最大数字-最小数字+1);
var数=[];
while(numbers.length<要生成的数字){
var number=Math.floor(Math.random()*(max_number-min_number))+min_number;
if(number.indexOf(number)=-1){
数字。推(数字);
}
}
控制台日志(编号);
解决方案2-从一个数字池中随机获取
var最小值=0;
var最大值=100;
风险值数值_至_生成=10;
//确保要生成的编号<(最大编号-最小编号)
var数=[];
var pool=Array.from(新数组(max_number-min_number),(x,i)=>i+min_number);
while(numbers.length<要生成的数字){
var number=pool.splice(Math.floor(Math.random()*(pool.length-1)),1)[0];
数字。推(数字);
}
控制台日志(编号);
从阵列中删除重复项的一些技巧/方法
让arr=[1,1,2,3,3,4,5,5,6];
设uArr1=[…新集合(arr)];
控制台日志(uArr1);
设uArr2=arr.filter((val,ind)=>arr.indexOf(val)==ind);
控制台日志(uArr2)代码>从数组中删除重复项的一些技巧/方法
让arr=[1,1,2,3,3,4,5,5,6];
设uArr1=[…新集合(arr)];
控制台日志(uArr1);
设uArr2=arr.filter((val,ind)=>arr.indexOf(val)==ind);
控制台日志(uArr2)代码>这就是你想要的吗
让arr=[2,3,5,7,9]
log(“这是您的arr”+arr)
let unique=[];
让数字_到_生成=arr.length;
let指数;
设i=0;
while(unique.length!=要生成的数字){
unique.push(arr[Math.floor(Math.random()*arr.length)];
索引=arr.indexOf(唯一[i]);
阵列拼接(索引,1)
我++
}
log(“这是唯一的”+唯一的)
这就是你想要的吗
让arr=[2,3,5,7,9]
log(“这是您的arr”+arr)
let unique=[];
让数字_到_生成=arr.length;
let指数;
设i=0;
while(unique.length!=要生成的数字){
unique.push(arr[Math.floor(Math.random()*arr.length)];
索引=arr.indexOf(唯一[i]);
阵列拼接(索引,1)
我++
}
log(“这是唯一的”+唯一的)
如果数组中的元素是唯一的,并且您需要许多(或全部)元素,一个简单的方法是:1)洗牌数组,2)首先选择n
元素
如果你不需要他们中的许多人洗牌,那么整个阵法就是杀伤力过大,而拾取可以与洗牌混合使用:
function randomOrder(L) {
let data = L.slice(), count = L.length;
return function() {
if (count === 0) throw Error("No more values available");
let j = Math.floor(Math.random()*count);
let value = L[j];
L[j] = L[--count];
return value;
};
}
如果元素不是唯一的,您还必须检查以前没有使用过相同的值;根据数组的大小和要提取的元素数量,使用Set
对象跟踪这些元素是有意义的:
function randomOrderDistinct(L) {
let data = L.slice(), count = L.length, used = new Set;
return function() {
for(;;) {
if (count === 0) throw Error("No more values available");
let j = Math.floor(Math.random()*count);
let value = L[j];
L[j] = L[--count];
if (!used.has(value)) {
used.add(value);
return value;
}
}
};
}
如果数组中的元素是唯一的,并且您需要许多(或全部)元素,那么一种简单的方法是:1)洗牌数组,2)首先拾取n
元素
如果你不需要他们中的许多人洗牌,那么整个阵法就是杀伤力过大,而拾取可以与洗牌混合使用:
function randomOrder(L) {
let data = L.slice(), count = L.length;
return function() {
if (count === 0) throw Error("No more values available");
let j = Math.floor(Math.random()*count);
let value = L[j];
L[j] = L[--count];
return value;
};
}
如果元素不是唯一的,您还必须检查以前没有使用过相同的值;根据数组的大小和要提取的元素数量,使用Set
对象跟踪这些元素是有意义的:
function randomOrderDistinct(L) {
let data = L.slice(), count = L.length, used = new Set;
return function() {
for(;;) {
if (count === 0) throw Error("No more values available");
let j = Math.floor(Math.random()*count);
let value = L[j];
L[j] = L[--count];
if (!used.has(value)) {
used.add(value);
return value;
}
}
};
}
我不知道你在这里想干什么。一旦生成,您就不能从数组中删除该数字吗?或者,你想确保同一个随机数永远不会连续生成。是的,我认为删除是正确的。如何删除?我想确保同一个数字永远不会重复。可能重复我将投票以重复正弦结束@ubuntu7788想要的实际上是一个洗牌,并且已经有了答案注意:您可以将答案与生成器函数
结合起来进行惰性评估。我不确定您在这里想做什么。一旦生成,您就不能从数组中删除该数字吗?或者,你想确保同一个随机数永远不会连续生成。是的,我认为删除是正确的。如何删除?我想确保同一个数字永远不会重复。可能重复我将投票关闭为dupe sine@ubuntu7788想要的实际上是一个洗牌,并且已经有了答案注意:您可以将答案与生成器函数
结合起来进行延迟评估拼接是一项代价高昂的操作(所选元素后面的所有元素都必须滑动一个位置)。您可以选择最后一个元素并将其放置在删除元素所在的位置。您可以对indexOf
说同样的话,并生成大量的数字,但这不是po