首页 > 解决方案 > 将随机值从数组复制到对象无法获得稳定的结果

问题描述

所以我正在为锦标赛创建一个机器人,但我被困在我想将球员分成两对参加附加赛风格的锦标赛的部分。我只想随机抽取 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 天,关于如何改进此代码的任何想法?

标签: javascriptarraysnode.jsrandomdiscord.js

解决方案


你得到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]
}

推荐阅读