【问题标题】:Random iteration to fill a table in Lua在 Lua 中填充表格的随机迭代
【发布时间】:2013-12-23 06:14:15
【问题描述】:

我正在尝试随机填充一个包含 26 个值的表格。也就是说,我有一个名为rndmalpha 的表,我想在整个表中随机插入值。这是我的代码:

rndmalpha = {}
for i= 1, 26 do
  rndmalpha[i] = 0
end

valueadded = 0

while valueadded = 0 do
  a = math.random(1,26)
  if rndmalpha[a] == 0 then
    rndmalpha[a] = "a"
    valueadded = 1
  end
end

while valueadded = 0 do
  a = math.random(1,26)
  if rndmalpha[a] == 0 then
    rndmalpha[a] = "b"
    valueadded = 1
  end
end

...

代码会一直重复到"z",所以这只是一个大概的想法。然而,我遇到的问题是,随着桌子被填满,随机命中率降低了。这有可能冻结程序,尤其是在最后的字母中,因为只有 2-3 个数字具有 0 作为值。那么,如果while 循环在最终达到最后一个数字之前经过一百万次调用会发生什么?有没有一种有效的方式可以说,“嘿,忽略第 6、13、17、24 和 25 号位置,专注于填补其他位置。”?就此而言,是否有更有效的方法来完成我正在做的事情?

【问题讨论】:

    标签: random lua iteration lua-table


    【解决方案1】:

    您使用的算法似乎效率很低,在我看来,您需要的只是用所有字母初始化一个表:

    math.randomseed(os.time())
    local t = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}    
    

    然后洗牌:

    for i = 1, #t*2 do
        local a = math.random(#t)
        local b = math.random(#t)
        t[a],t[b] = t[b],t[a]
    end  
    

    将元素交换为#t*2 次可以很好地提供随机性。如果您需要更多随机性,请增加洗牌次数,并使用更好的随机数生成器。 C 库提供的random() 函数通常不是那么好。

    【讨论】:

    • 这更有意义!有时,我把事情复杂化了,把事情弄得比原来要难得多。谢谢!
    【解决方案2】:

    不要对每个字母进行随机化,而是遍历表格一次,并在每个位置随机获取一些东西。您使用的方法可能会持续很长时间,因为您可能永远都不会成功。

    永远不要重复自己。永远不要重复自己!如果您过于频繁地复制和粘贴,那肯定是出现问题的迹象。使用第二个表格来包含您可以选择的所有可能的字母,然后从中随机选择。

    letters = {"a","b","c","d","e"}
    numberOfLetters = 5
    
    rndmalpha = {}
    
    for i in 1,26 do
        rndmalpha[i] = letters[math.random(1,numberOfLetters)]
    end
    

    【讨论】:

    • 如果不是余皓,这本来是我接受的答案。像上面一样,我有时会过度复杂化事情,这会更好。感谢您提供更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多