мы находимся в контексте сценария lua, который использует некоторые функции C / C ++, экспортированные для использования с 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) ограниченным определенной областью? поэтому вызов rand () в функции c ++ _ будет использовать seed 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.randomseed
перед каждым звонком math.random
, но только после звонка c++function
, как указано выше.
Вероятно, вы не сможете ограничить область действия srand (), чтобы повлиять только на ваш вызов math.random ().
Я бы предложил использовать генератор случайных чисел, который не зависит от встроенного. Увидеть Генерация равномерных случайных чисел в Lua для примера.