我们可以限制srand的范围

时间:2015-07-03 07:49:30

标签: c++ lua random-seed

我们在lua脚本的上下文中,它使用导出的一些C / C ++函数与lua一起使用。

在lua,我们有

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

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

所以我们的math.randomseed(12)将没有任何效果,我们将在每次迭代中都有srand(0),rand()调用,然后是math.random()调用(只调用C) rand()函数)。 因为我们总是给同一个种子,所以我们总是生成相同的序列。

问题是,是否存在使srand(x)限于特定范围的解决方案?所以c ++ _函数中的rand()调用将使用种子0,当我们返回到lua时,math.random()使用math.randomseed(x)。

如果不是,任何人都有建议吗?

谢谢

2 个答案:

答案 0 :(得分: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.randomseed之前,请确保致电math.random,但仅在致电c++function之后,如上所述。

答案 1 :(得分:0)

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

我建议使用独立于内置的随机数生成器。有关示例,请参阅Generating uniform random numbers in Lua