如何在 Lua 中生成无重复的随机数据?

我之前曾经问过这个问题,但是没有得到我想要的答案。经过检查,我意识到这是我的问题,因为我没有清楚地表明我的目标,我很抱歉。我正在为我正在学习的 AP 统计课程编写代码,其中必须生成无重复的随机数据。TI 计算器使用 Lua,因此我希望我可以编写一个程序,不仅可以生成数字,还可以为我回答问题,以缩短所需的时间。这个任务的名称是“ESP。”我将缩短情节,有两个人,Amy 和 Ben,他们在两张索引卡上写了他们的名字,然后把他们的卡片放在一个信封里。现在有两个信封里面有两个人的名字。第三个人给了这两个人一个信封。该任务是模拟 20 次或更多次试验。每次试验是指这个人把信封交给他们。以下是我编写的代码来模拟这个过程: math.randomseed(os.time())

Amy = 0
Ben = 1

print(“输入您想要模拟的试验次数。”)

res = io.read()

for c = 1,res do
    print(“试验 #”..c)

    Amy_ = Amy - math.random(01)
    如果 Amy_ == 0 然后
        print(“Amy = 匹配”)
    elseif Amy_ ~= 0 然后
        print(“Amy = 不匹配”)
    end

    Ben_ = Ben - math.random(01)
    如果 Ben_ == 0 然后
        print(“Ben = 匹配”)
    elseif Ben_ ~= 0 然后
        print(“Ben = 不匹配”)
    end

end

while true do
end

这个问题是你可能得到一个结果说: 试验 #1 Amy = 匹配 Ben = 不匹配

然而,只有一个人得到匹配,另一个人得到不匹配是不可能的。因此,我想知道是否有一种方法可以避免重复,而不是使用 2 个人而是使用 10 个人。此外,该程序可以告诉我每次试验中某个数量的匹配发生了多少次。例如,该程序可能会说“3 次匹配 - 2 次”,这意味着在“n”个试验中,有 2 次试验有 3 个匹配项。匹配是指他们得到带有他们名字的信封。也许这将涉及 Fisher-Yates Shuffle。既然我已经明确表达了我的目标,这可能吗?此外,我将 Amy = 0 和 Ben = 1 的原因是因为在原始作业中有 10 个人,0-9,另外,最初我将它们命名为 a-j,我只是选择了 Amy 和 Ben,以便更容易看到这个 Lua 程序的目标。

点赞
用户1009479
用户1009479
  1. 你正在使用错误的算法。不要生成10个独立的随机数,而是生成一个包含0到9的数组,并将其洗牌。参考Fisher-Yates shuffle
  2. 参见Lua math.random不起作用
2016-02-21 03:40:52
用户3979429
用户3979429

许多人经常面临相同的问题,这里我提供的解决方案可能对他们中的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

您可以轻松修改此内容,将Random封装为采取任何数字范围。

2016-02-21 13:00:14