Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从JavaScript中的数字数组生成非重复随机数?_Javascript_Arrays - Fatal编程技术网

如何从JavaScript中的数字数组生成非重复随机数?

如何从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=[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在此重复,如何确保随机数从不重复。

解决方案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