Javascript 选择15个随机数,将其放入洗牌,以避免重复

Javascript 选择15个随机数,将其放入洗牌,以避免重复,javascript,random,shuffle,Javascript,Random,Shuffle,假设我在1和12之间选择10个随机数,并将它们放入一个数组中。我如何循环使用它以消除重复项 我在这方面花了很多时间,但无法使它工作。如果你想要15个介于1和20之间的随机整数,而不需要重复,这是你范围内的大多数整数。我只需生成数字1-20,然后删除随机数字15次: function randomIntegersInRange(min:int, max:int, count:uint):Array { if (min >= max || count > max - min) t

假设我在1和12之间选择10个随机数,并将它们放入一个数组中。我如何循环使用它以消除重复项


我在这方面花了很多时间,但无法使它工作。

如果你想要15个介于1和20之间的随机整数,而不需要重复,这是你范围内的大多数整数。我只需生成数字1-20,然后删除随机数字15次:

function randomIntegersInRange(min:int, max:int, count:uint):Array {
    if (min >= max || count > max - min) throw new ArgumentError("Invalid arguments!");
    var integers:Array = [];
    for (var i:int = min; i <= max; i++) {
        integers.push(i);
    }

    var randomIntegers:Array = [];
    for (i = 0; i < count; i++) {
        randomIntegers.push(integers.splice(Math.random() * integers.length, 1));
    }
    return randomIntegers;
}

randomIntegersInRange(1, 20, 15); // 16,4,3,13,8,17,1,19,20,15,6,18,14,10,12
randomIntegersInRange(1, 50, 20); // 27,3,19,9,42,23,13,29,11,24,41,31,26,2,7,30,49,33,6,10
函数随机整数范围(最小:int,最大:int,计数:uint):数组{
如果(min>=max | | count>max-min)抛出新参数错误(“无效参数!”);
变量整数:数组=[];

对于(var i:int=min;i执行递归方法

function pushIt(arr){
 var idx:int;
 if(arr.length == 10){ return arr; }
 else { 
   idx = Math.floor(Math.random() * 12) + 1;
   if(arr.indexOf(idx) == -1){ arr.push(idx); } 
   return pushIt(arr);
 }
}

console.log(pushIt([]));

[5,1,8,4,10,9,11,2,6,7]

函数generateUniqueArray(长度,最大范围){
var-arr=[];
while(arr.length对于(var i=0;i您可以将它们放入哈希(js对象)中,然后返回哈希中的键:

function getUniques(arr){
   var seen = {};
   arr.forEach(function(item){
     seen[item] = true;
   });
   return Object.keys(seen);
}

此问题有两种解决方法:

创建一个随机数,检查是否已拾取,如果未拾取,则将此值添加到输出

var numbers = [];
while(numbers.length < 10){
    var nr = Math.floor(Math.random() * 12)+1
    if(numbers.indexOf(nr) === -1) numbers.push(nr);
    else console.log("threw away ", nr);
}
var number=[];
while(数字。长度<10){
var nr=Math.floor(Math.random()*12)+1
if(number.indexOf(nr)=-1)number.push(nr);
else控制台日志(“丢弃”,nr);
}
这很有效,如果你想从大范围中选择少量的数字, 因为在这里,它可能会遇到一些碰撞(一遍又一遍地选择相同的随机数,然后不得不扔掉)

在您的情况下,12个值中有10个值,很可能会有很多命中率 在结束时,代码必须一次又一次地创建随机数才能找到另一个 您的集合中还没有的号码

因此,我们进入第二个步骤:创建一个包含所有可能值的集合,将其洗牌, 然后从中取出一片

//a helper to shuffle the array
function shuffle(arr){
    for(var i=arr.length; --i > 0; ){
        var j = Math.floor(Math.random() * i);
        var tmp = arr[j];
        arr[j] = arr[i];
        arr[i] = tmp;
    }
    return arr;
}

//a helper to create a sequence ov values
function range(from, to, step){
    step = Math.abs(+step) || 1;
    to = +to || 0;
    var i = +from || 0, out = [];
    if(i > to) while(i>to) out.push(i), i -= step;
    else while(i<to) out.push(i), i += step;
    return out;
}

var numbers = shuffle(range(1,13)).slice(0, 10);
//用于洗牌数组的助手
函数洗牌(arr){
对于(变量i=arr.length;--i>0;){
var j=Math.floor(Math.random()*i);
var tmp=arr[j];
arr[j]=arr[i];
arr[i]=tmp;
}
返回arr;
}
//用于创建序列ov值的助手
功能范围(从,到,步长){
步骤=数学abs(+步骤)| 1;
至=+至| | 0;
变量i=+从| | 0开始,输出=[];
如果(i>to)同时(i>to)向外推(i),i-=步进;

其他时间(iis)java或javascript?两者都是完全相同的different@Xoce你怎么看?它在for循环中有
var i=0
。为什么java标记为大于???@rahulsharmapopular的副本,但是如果我想要随机数?例如,让我们从1-50中选择20,而不获得任何副本?这会给你随机数。如果你要参数化范围,只需将上面的
20
15
更改为变量。@CollapsedSounds将我的答案编辑成一个带有范围和计数参数的函数。谢谢你的回答。不过我还有一个问题。当我尝试调用此函数时,让我们从一个按钮上说“将值类型数组隐式强制转换为不相关的类型函数。”我如何处理此问题?听起来好像您尝试了
addEventListener(“evt”,随机整数(1,20,15))
,但您需要将函数作为处理程序传递,而不是调用函数。您可以从类似
addEventListener(“evt”,handler)的处理程序调用此函数;函数处理程序(e:Event):void{randomIntegers(1,20,15)}
generateUniqueArray(12,10)
crash;)