Можем ли мы ограничить сферу действия

мы находимся в контексте сценария 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).

Если нет, у кого-нибудь есть предложение?

Спасибо

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

Другие решения

Вероятно, вы не сможете ограничить область действия srand (), чтобы повлиять только на ваш вызов math.random ().

Я бы предложил использовать генератор случайных чисел, который не зависит от встроенного. Увидеть Генерация равномерных случайных чисел в Lua для примера.

0

По вопросам рекламы [email protected]