所以我正在为锦标赛创建一个机器人,但我被困在我想将玩家分成两对进行附加赛式锦标赛的部分。我只想随机抽取 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/