Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 Can';将随机值从数组复制到对象无法获得稳定的结果_Javascript_Arrays_Node.js_Random_Discord.js - Fatal编程技术网

Javascript Can';将随机值从数组复制到对象无法获得稳定的结果

Javascript Can';将随机值从数组复制到对象无法获得稳定的结果,javascript,arrays,node.js,random,discord.js,Javascript,Arrays,Node.js,Random,Discord.js,所以我正在为一场比赛创建一个机器人,我被困在了我想把球员分成两人一组进行季后赛式的比赛的部分。我只想随机选取2个玩家,从数组中获取他们,并将其作为一个值写入一个键,作为一个对象的圆形id。此外,我不应该在配对中再次使用这些播放器,因此需要删除它们或smth。 代码如下: var users = inc.funcs.getDatabase() //Getting a raw array of users (using my func that's basically a simplified fs

所以我正在为一场比赛创建一个机器人,我被困在了我想把球员分成两人一组进行季后赛式的比赛的部分。我只想随机选取2个玩家,从数组中获取他们,并将其作为一个值写入一个键,作为一个对象的圆形id。此外,我不应该在配对中再次使用这些播放器,因此需要删除它们或smth。
代码如下:

var users = inc.funcs.getDatabase() //Getting a raw array of users (using my func that's basically a simplified fs.readFileSync func)
var tournamentPairs = new Object() //Object initialization

var id = 1
for (var i = 0; i < 16; i = i + 2) {
   var first = Math.floor(Math.random() * (users.length + 1)) //Randomizing 2 indexes
   var second = Math.floor(Math.random() * (users.length + 1))

   var player1 = client.users.get(users[first]) //Getting the players by id 
   var player2 = client.users.get(users[second])

   tournamentPairs[id++] = [player1.id, player2.id] //Writing to the object

   users.splice(first, 1) //Deleting user's indexes from the array to not use them anymore.
   users.splice(second, 1)
}
console.log(tournamentPairs)
var users=inc.funcs.getDatabase()//获取用户的原始数组(使用基本上是简化的fs.readFileSync func的my func)
var tournamentPairs=new Object()//对象初始化
变量id=1
对于(变量i=0;i<16;i=i+2){
var first=Math.floor(Math.random()*(users.length+1))//随机化2个索引
var second=Math.floor(Math.random()*(users.length+1))
var player1=client.users.get(users[first])//通过id获取玩家
var player2=client.users.get(用户[秒])
tournamentPairs[id++]=[player1.id,player2.id]//写入对象
splice(first,1)//从数组中删除用户的索引以不再使用它们。
用户.拼接(第二,1)
}
console.log(tournamentPairs)
它在外部工作得很好,但是有一个复制用户的坏习惯,比如我曾经可以用gamergod98和gamergod98。我尝试了
console.log
这个废话,但在尝试
console.log
player2
时,它经常出错,因为它是
未定义的
。如果我尝试打印
用户[第二个]
我会得到
未定义的
,尽管第一个玩家从未这样做过。所以我尝试了不同的方法来防止这种情况:
first==second
。长话短说,没什么帮助。

距离比赛开始还有9天的时间,有没有关于如何改进此代码的想法?

您将获得
未定义的
,因为您超出了
用户列表的范围。对于
长度的列表
最后一个元素是
list[length-1]
,但您将生成长度为
的随机数

要修复重复用户,请先从列表中删除第一个选定用户,然后再选择第二个用户(或者对于破坏性较小的方法,请标记已选定用户)

var id=1
对于(变量i=0;i<16;i=i+2){
var first=Math.floor(Math.random()*users.length)
var player1=client.users.get(用户[第一个])
用户.拼接(第一,1)
var second=Math.floor(Math.random()*users.length)
var player2=client.users.get(用户[秒])
用户.拼接(第二,1)
锦标赛配对[id++]=[player1.id,player2.id]
}

创建已用索引的集合,然后如果第一个或第二个索引在已用索引中,则继续

var usedIndices = [] ;

if (usedIndices.indexOf(first) >= 0 || 
usedIndices.indexOf(second) >= 0) {
continue;
} else { 
usedIndices.push(first);
usedIndices.push(second);
}

将usedIndices变量放在for循环之前,将if-else块放在第二次之后的循环内部

您的随机数使用的是
users.length+1
,因此您偶尔会得到该值,或者
users.length
,两者都不是数组中的有效索引。你可能想看看如何洗牌数组,而不是拉随机索引。可能是@HereticMonkey的重复,我可能有问题的类型,但我也很难避免再次重复使用随机值。我有一个与你类似的代码,但列表的长度没有问题。非常感谢你!
var usedIndices = [] ;

if (usedIndices.indexOf(first) >= 0 || 
usedIndices.indexOf(second) >= 0) {
continue;
} else { 
usedIndices.push(first);
usedIndices.push(second);
}