【问题标题】:Can we limit the scope of srand我们可以限制 srand 的范围吗
【发布时间】:2015-09-20 23:28:21
【问题描述】:

我们处于一个 lua 脚本的上下文中,该脚本使用一些导出的 C/C++ 函数以与 lua 一起使用。

在lua中,我们有

math.randomseed(12) // 12 for example
for i=0, 10 do
    c++function()
    print(math.random())
end

输出总是相同的数字。 当我看到原因时,我发现在 c++_function 中,有一个 srand(0) 和一些对 rand() 函数的调用。

所以我们的 math.randomseed(12) 将不起作用,我们将在每次迭代中调用 srand(0)、rand() 调用,然后调用 math.random()(只调用 C rand() 函数)。 因为我们总是给出相同的种子,所以我们总是生成相同的序列。

问题是,有没有办法让 srand(x) 限制在特定范围内?所以 c++_function 中的 rand() 调用将使用种子 0,当我们返回 lua 时,math.random() 使用 math.randomseed(x)。

如果没有,有人有什么建议吗?

谢谢

【问题讨论】:

  • 不能改c++函数吗? srand() 在整个程序中只能调用一次。
  • 不是,因为c++函数调用独立于lua脚本,所以问题只出现在这个例子中,因为他们都做了srand。在另一个 lua 脚本中,我们可以在没有 math.randomseed 的情况下调用 c++_function。
  • 如果你不能改变math.randomseedc++function中的任何一个,恐怕你就倒霉了……

标签: c++ lua random-seed


【解决方案1】:

很遗憾,srand 没有返回其当前种子。不过,你可以伪造它。试试这个:

function call_c_function()
    local s=math.random(1,2^30)
    c++function()
    math.randomseed(s)
end

for i=0, 10 do
    call_c_function()
    print(math.random())
end

只要确保您不要在每次调用math.random之前调用math.randomseed,而是只在调用c++function之后调用,如上所述。

【讨论】:

  • Thx.this 会起作用,但修改应该在 c++ 代码中。我们交付我们的 c++ 代码以供客户在 lua 脚本中使用。所以,我不能对他们的 lua 文件中的选择采取行动。我看到了代码,在我看来,我可以从 c++ 函数中删除 srand,我提出了一个建议,我等待答案。这将解决问题:)
  • @ahmedbouchaala,您始终可以分发一个小型 Lua 文件,该文件包含与srand 混淆的函数。但首先要避免混乱是要走的路:srand 应该在程序中只被调用一次。
【解决方案2】:

您可能无法限制srand()的范围仅影响Math.Random()的调用。

我建议使用独立于内置的随机数生成器。查看Generating uniform random numbers in Lua举个例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2018-09-15
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多