当前位置: 首页 > 知识库问答 >
问题:

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

李烨
2023-03-14

我之前问过这个问题,但是没有得到我想要的答案。经检查,这是我的错,因为我没有明确我的目标是什么,我很抱歉。我正在为一个AP统计类编写代码,我在其中必须生成没有重复的随机数据。TI计算器使用Lua,所以我希望我能制作一个程序,不仅生成数字,还能回答我的问题,只是为了缩短所需的时间。作业的名称是“ESP”为了时间的缘故,我会缩短场景,有两个人,艾米和本,他们在两张索引卡上写上名字,然后把他们的卡片放在信封里。现在有两个信封,里面有两个人的名字。第三个人给了这两个人一个信封。任务是模拟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次比赛。匹配是他们收到了写有他们名字的信封。也许这将涉及费希尔-耶茨洗牌。既然我已经明确地重新陈述了我的目标,这可能吗?另外,我设置艾米=0和本=1的原因是因为在最初的作业中,有10个人,0-9,还有,最初我把他们命名为a-j,我只是选择艾米和本,这样更容易看到什么目标是这个Lua计划。

共有2个答案

乐正洲
2023-03-14
  1. 你使用了错误的算法。不要生成10个独立的随机数,而是生成一个从09的数组,并将其洗牌。看看费舍尔-耶茨洗牌。
云炜
2023-03-14

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

math.randomseed(os.time())

它为unix时间设置种子,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

您可以很容易地修改它,将其包装为随机,以获取任意范围的数字。

 类似资料:
  • 问题内容: Java的UUID类生成随机的UUID。但这由字母和数字组成。对于某些应用,我们只需要数字。有没有一种方法可以生成仅由Java中的数字组成的随机UUID? 问题答案: 如果您不想使用随机数,但是带有数字的UUID仅使用: 在这种情况下,左填充为40个零… 结果为: UUID:b55081fa-9cd1-48c2-95d4-efe2db322a54 in: UUID:0241008287

  • 问题内容: 谁能告诉我如何生成不重复的随机数 随机(10)应该(可能)返回3、4、2、1、7、6、5、8、9、10,而无需重复 谢谢 问题答案: 我建议将数字加到,然后使用来随机化其顺序。像这样:

  • 问题内容: 有没有一种方法可以在Java中随机获取HashMap的值? 问题答案: 这有效: 如果您希望随机值不是类型,只需在最后一行添加强制类型转换即可。因此,如果声明为: 最后一行可以是: 下面的代码 无效 ,总是返回s 数组,不能将其强制转换为。

  • 我使用了这段代码来随机化1000000个数字而不重复。这是我目前所掌握的。 这种方法太慢了,你能告诉我如何更有效地完成这项工作吗?我感谢所有答复。问候

  • 问题内容: 我正在开发一个新项目(),并创建了一个包含大量变量的Object。由于我打算为所有这些添加吸气剂和设置器,所以我想知道:是否存在在给定类中自动生成吸气剂和设置器的捷径? 问题答案: 在所需类的源代码窗口中弹出上下文菜单(即右键单击)。然后选择子菜单;从该菜单中进行选择将导致出现向导窗口。 选择您要为其创建getter和setter的变量,然后单击。

  • 我目前正在创建一个应用程序,它将生成随机数。所以每次它都会生成三个数字num1、num2和num3。这些数字不应该重复。例如,如果num1=1,则num2和num3不能等于1。我尝试过此代码,它将显示0-2之间的三个不同数字。然而,我想生成1-3、2-4、3-5等范围内的随机数。因此,我如何通过使用下面的代码来实现这一点。请帮帮我,因为我是新手。非常感谢。