从列表中随机选择短语。

我一直在使用一个.lua文件娱乐,其中通过以下行传递一个随机短语:

SendChatMessage(GetRandomArgument("text1", "text2", "text3", "text4"), "RAID")

我的问题是,我有很多短语,但一行代码非常长。

有没有一种方法可以将其它地方(或外部)的

text1
text2
text3
text4

存储在代码中的列表中,并从主代码中调用随机值。 这将使维护文本选项列表更容易。

原文链接 https://stackoverflow.com/questions/1396870

点赞
stackoverflow用户48383
stackoverflow用户48383

你想要一个表格包含你的短语,例如:

phrases = { "tex1", "text2", "text3" }
table.insert(phrases ,"text4") -- 另一种语法
SendChatMessage(phrases[math.random(table.getn(phrases))], "RAID")

注意: getn 获取表格的大小;math.random 获取一个随机数(最大为短语表格的大小),而phrases[] 语法返回 [] 内索引的表格元素。

2009-09-08 23:49:27
stackoverflow用户68204
stackoverflow用户68204

对于长度不超过几百个元素的列表,以下代码可用:

messages = {
    "text1",
    "text2",
    "text3",
    "text4",
    -- ...
}
SendChatMessage(GetRandomArgument(unpack(messages)), "RAID")

对于更长的列表,您最好将 GetRandomArgument 替换为 GetRandomElement,它会将单个表作为参数并从该表返回一个随机条目。

编辑: Olle的答案 展示了实现类似 GetRandomElement 的方法。但它在每次调用时都使用了 table.getn,而在Lua 5.1中被废弃,它的替代品(table.maxn)运行时间与表中元素数量成比例。

只有当使用的表可能在其数组部分中具有缺失元素时才需要函数 table.maxn。但是,在需要从列表中选择的项目列表中,可能没有理由需要允许空洞。如果您需要运行时编辑列表,则始终可以使用 table.remove 删除项,因为它也会关闭空洞。

如果可以保证文本数组中没有空洞,则可以像这样实现 GetRandomElement

function GetRandomElement(a)
    return a[math.random(#a)]
end

所以您可以像这样发送消息:

SendChatMessage(GetRandomElement(messages), "RAID")
2009-09-08 23:49:28