我们能限制srand的范围吗

Can we limit the scope of srand

本文关键字:范围 srand 我们      更新时间:2023-10-16

我们所处的环境是一个lua脚本,该脚本使用一些导出的C/C++函数来与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++函数中的rand((调用将使用种子0,当我们返回到lua时,math.random((使用math.randomseed(x(.

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

感谢

不幸的是,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之后调用,如上所述。

您可能无法将srand((的范围限制为仅影响您对math.random((.的调用

我建议使用独立于内置的随机数生成器。有关示例,请参见Lua中的生成统一随机数。