首页 > 解决方案 > 如何从字典中的数组中调用随机值?(不和谐机器人)

问题描述

我有一本字典,比方说:

var array1 = ["value 1", "value 2", "value 3"];
var array2 = ["value 1", "value 2", "value 3"];

var dict = {"this":array1,"that":array2};

鉴于我选择了一个键,如何从字典中调用数组中的随机值?

例如

dict["this"] // Should return a random value from array rather than all values

我曾尝试使用 Math.random 来获取随机索引号,哪种可行,但是使用它时,它总是返回相同的值,这意味着用于索引的随机数生成器只运行一次并且不会更新,除非我重新启动代码,否则每次都会从数组中给出相同的值。

var array1 = ["value 1", "value 2", "value 3"]; // array1
var array2 = ["value 1", "value 2", "value 3"]; // array2

var randthis = Math.floor(array1.length * Math.random()); // random index for array 1
var randthat = Math.floor(array2.length * Math.random()); // random index for array 2

var dict = {"this":this[randthis],"that":that[randthat]};

msg.client.send(dict[this])

我应该如何做到这一点,以便随机索引每次都会给我一个不同的索引?或者以不同的方式来实现这一点。我知道我可以通过导入 random 和使用 random.choice(dict[this]) 在 Python 中实现这一点

更新:我的字典在与服务器模块不同的模块中,因此同一模块中没有太多代码。所以我从dictionary.js 导出字典并在actualcode.js 中使用它(不要认为这很重要,但要说明它只是为了确保)

更新 2:

server.js:

const Discord = require("discord.js");
const client = new Discord.Client;
const cmd = require("./commands");

client.on("message", msg => {
  const prefix = '$'

  if (msg.author == client.user){
    return
  };

  if (msg.content.startsWith(prefix)){
    var command = msg.content.split(prefix).slice(1);
    msg.channel.send(cmd[command+"_cmd"]);
  }

});

命令.js:

var array1 = ["value 1", "value 2", "value 3"]
var array2 = ["value 1", "value 2", "value 3"]
var randindex = Math.floor(array1.length * Math.random())
var randindex2 = Math.floor(array2.length * Math.random())

var cmd = {"test_cmd":array1[randindex], "test2_cmd":array2[randindex2]}

module.exports = cmd

标签: javascriptdictionarydiscord.js

解决方案


每次获得相同结果的原因commands.js仅在您第一次将文件加载到server.js.

“修复”这个问题的方法是在命令中导出一个函数,并根据需要执行该函数:

function execCmd() {
    var array1 = ["value1", "value 2", "value 3"]
    var randindex = Math.floor(array1.length * Math.random())

    return {"test_cmd":array1[randindex]}
}

module.exports = execCmd;

const Discord = require("discord.js");
const client = new Discord.Client;
const cmd = require("./commands");

client.on("message", msg => {
  const prefix = '$'

  if (msg.author == client.user){
    return
  };

  if (msg.content.startsWith(prefix)){
    var command = msg.content.split(prefix).slice(1);
    var rndDict = cmd();
    msg.channel.send(rndDict[command+"_cmd"]);
  }

});

推荐阅读