【问题标题】:Choose a random item from a table从表中选择一个随机项目
【发布时间】:2011-02-28 14:47:42
【问题描述】:

我的目标是从 Lua 的表格中随机挑选出一个项目。

这是我到目前为止所得到的,但它目前不起作用:

local myTable = { 'a', 'b', 'c', 'd' }
print( myTable[ math.random( 0, #myTable - 1 ) ] )

如何修复上述代码以使其按预期工作? (或者我可以使用其他哪种方法?)

【问题讨论】:

  • 我想补充一下。是的,默认情况下,lua 数组中的第一个索引是 1。但是,您可以让它从 0 开始,如下所示:array = {[0] = 'a', 'b', 'c'} print(array[0 ]) >> a 'b' 将在索引 1 处跟进,'c' 在索引 2 处跟进...

标签: random lua


【解决方案1】:

Lua 从 1 开始索引表,不像 C、Java 等从 0 开始索引数组。这意味着,在您的表中,有效索引是:1、2、3、4。您正在寻找的是以下内容:

print( myTable[ math.random( #myTable ) ] )

当使用一个参数调用时,math.random(n) 返回一个从 1 到 n 的随机整数。

【讨论】:

    【解决方案2】:

    我认为这个问题还需要一个更笼统的答案。使用从 1 开始的整数序列构建 lua 表没有任何限制。键实际上可以是任何东西——它们甚至可以是其他 lua 表!在这种情况下,#myTable 之类的函数可能会给出您意想不到的答案(在没有任何自定义元表功能的情况下使用时)。获取表中所有键的唯一可靠方法是对其进行迭代:

    -- iterate over whole table to get all keys
    local keyset = {}
    for k in pairs(myTable) do
        table.insert(keyset, k)
    end
    -- now you can reliably return a random key
    random_elem = myTable[keyset[math.random(#keyset)]]
    

    我还要补充一点,如果您的所有键都是从 1 开始的数字序列,Michal Kottman 的原始解决方案将完美运行。每当您将表创建为 myTable = {'a','b','c'} 时,都会发生这种情况。因此,对于以这种方式构建表格的情况,从表格中获取随机元素会更快。

    【讨论】:

      【解决方案3】:

      测试:

      t = {'a', 'b', 'c'}
      print(t[0])
      

      给出nil。事实上 0 超出范围(尝试t[20])...所以随机数必须从 1 到 #myTable(含)因为如果你只写 table 的第一个元素被标记(索引)为 1 987654328@,参见Table constructor(“最后,exp 形式的字段等价于 [i] = exp,其中 i 是从 1 开始的连续整数。”)。

      如果你传递给math.random 只是一个参数n,你会得到一个从1 到n 的随机数。这修复了您的示例:

      print(myTable[math.random(#myTable)])
      

      【讨论】:

        【解决方案4】:
        table = {'Apple', 'Banana', 'Orange', 'Watermelon' , 'lychee'} --my table have 5 item.
        
        rand= math.random(1~5) --create a random number numbers 1 to 5 if more than 5 then the value is nil.
        
        print(rand)
        print(table[rand]) --unite the random number and item it will display 5 random items in the table.
        

        【讨论】:

          【解决方案5】:

          我个人使用受@ahmadh启发的以下函数

          function random_elem(tb)
              local keys = {}
              for k in pairs(tb) do table.insert(keys, k) end
              return tb[keys[math.random(#keys)]]
          end
          

          【讨论】:

            【解决方案6】:
            function randomObjectFromTable(t)
               return t[math.random(1, #t)]
            end
            

            【讨论】:

            • 社区鼓励在代码中添加解释,而不是纯粹基于代码的答案(参见here)。
            猜你喜欢
            • 2012-09-11
            • 2010-09-23
            • 2011-11-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多