javascript - 无法通过将随机值从数组复制到对象来获得稳定的结果

标签 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.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)

它在外面工作得很好,但有重复用户的坏习惯,例如我曾经有过 gamergod98 vs gamergod98。我尝试了 console.log 这个废话,但在尝试 console.log player2 时经常会出错,因为它是 undefined 出于某种原因。如果我尝试打印 users[second] 我会得到 undefined 尽管它从未发生在第一个玩家身上。所以我尝试了不同的方法来防止出现这种情况:first == second。长话短说,它并没有多大帮助。
距离比赛开始还有 9 天,关于如何改进此代码有什么想法吗?

最佳答案

您得到 undefined 因为您超出了 users 列表的范围。对于 length 的列表,最后一个元素是 list[length-1],但您生成的随机数最大为 length

要修复重复的用户,请在选择第二个用户之前从列表中删除第一个选定的用户(或者为了破坏性较小的方法,标记已选定的用户)。

var id = 1
for (var i = 0; i < 16; i = i + 2) {
   var first = Math.floor(Math.random() * users.length)
   var player1 = client.users.get(users[first]) 
   users.splice(first, 1)

   var second = Math.floor(Math.random() * users.length) 
   var player2 = client.users.get(users[second])
   users.splice(second, 1)

   tournamentPairs[id++] = [player1.id, player2.id]
}

关于javascript - 无法通过将随机值从数组复制到对象来获得稳定的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57540034/

相关文章:

node.js - 用于 AWS EC2 中的 pubsub 和缓存的 Redis 配置

javascript - 嵌套 javascript 哈希的默认值

php - Array Merge PHP不断创建子/维数组

数组列表的python max

javascript - 如何将字符串转换为 JavaScript 数组

node.js - 与应用程序一起分发 Google API 凭据是否安全?

node.js - ExpressJS 路由 + Websockets - 共享端口

javascript - 选择 "Open link in new tab"和 "Open link in new windw"后调用Javascript函数

javascript - 自动从 Dynamics 365 和 Azure 更新外部数据库

javascript - 1 个阵列中有许多网格的众多场景