javascript - 将随机值从数组复制到对象无法获得稳定的结果
问题描述
所以我正在为锦标赛创建一个机器人,但我被困在我想将球员分成两对参加附加赛风格的锦标赛的部分。我只想随机抽取 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]
}
推荐阅读
- reactjs - 未使用 firebase 正确部署反应应用程序
- python - 如何在python中自动动态创建类的实例
- angularjs - 即使视频(及其容器)设置为“显示:无”,也会播放音频;
- jquery - php和jquery制作的小问题比较脚本
- html - CSS 放置:文本和按钮的水平和垂直放置
- python - 如何在 android studio 中使用 python ML
- java - 带有 ListView 的 ConstraintLayout 不显示任何数据
- typescript - Sequelize Model Loader 未检测到模型方法
- flutter - Dart - 无法创建 toJSON 方法
- python - pandas: how to group rows into a new column