有没有一种很好的方法在Lua中生成随机数据而没有重复?

时间:2016-02-21 02:46:08

标签: random lua

之前我问过这个问题,但没有得到我想要的答案。经过检查,这是我的错,因为我没有说明我的目标是什么,我很抱歉。我正在为AP统计类I代码制作代码,其中必须生成没有重复的随机数据。 TI计算器使用Lua,因此我希望我能制作一个程序,不仅可以生成数字,还可以为我回答问题,只是为了缩短所需的时间。作业的名称是" ESP。"为了时间的缘故,我会缩短这个场景,有两个人,Amy和Ben,他们在两张索引卡上写下了名字,然后将他们的卡放在一个信封里。现在有两个信封,里面有两个人的名字。第三个人给这两个人一个信封。任务是模拟20个或更多的试验。审判是向他们提供信封的人。这是我编写的代码来模拟这个: math.randomseed(os.time())

Amy = 0
Ben = 1

print("Enter the number of trials you want to simulate.")

res = io.read()

for c = 1, res do
    print("Trial #"..c)

    Amy_ = Amy - math.random(0, 1)
    if Amy_ == 0 then
        print("Amy = match")
    elseif Amy_ ~= 0 then
        print("Amy = not a match")
    end

    Ben_ = Ben - math.random(0, 1)
    if Ben_ == 0 then
        print("Ben = match")
    elseif Ben_ ~= 0 then
        print("Ben = not a match")
    end

end

while true do
end

这个问题是你可以得到一个结果: 试验#1 艾米=比赛 本=不匹配

但是,只有一个人不可能获得比赛,反之亦然。所以我一直想看看是否有办法避免重复10人而不是2人。另外,程序告诉我每次试验发生了多少次匹配。例如,程序会说" 3匹配 - 2次",这意味着' n'试验,2项试验有3场比赛。一场比赛,他们得到了他们的名字的信封。也许这将涉及Fisher-Yates Shuffle。现在我已经明确重申了我的目标,这可能吗?另外,我设置Amy = 0和Ben = 1的原因是因为在原始作业中,有10个人,0 - 9,原来我将它们命名为a - j,我只是选择了Amy和Ben这样它&# 39;这个Lua程序更容易看出目标是什么。

2 个答案:

答案 0 :(得分:2)

  1. 您使用的是错误的算法。而不是生成10 独立的随机数,生成一个09的数组,和 洗牌吧。看看Fisher–Yates shuffle
  2. 请参阅Lua math.random not working

答案 1 :(得分:2)

许多人经常面临同样的问题,在这里我提供的解决方案可能有助于大约99%的人:

math.randomseed(os.time())

它将种子设置为unix时间,该时间总是在变化,因此每次都会有所不同。

但是只是把它放在脚本之上,不要多次使用它。

如果你想完全忽略重复:

local left = {}
for i = 1,10 do
    left[i] = i
end

local function Random()
    return table.remove(left, math.random(#left))
end

for i = 1,10 do
    print(Random())
end

你可以轻松地修改它以包装随机以获取任何数字范围。