Logitech Gaming Software - код сценария lua для чистых случайных чисел - PullRequest
2 голосов
/ 19 марта 2019

Я несколько дней пытался найти способ сделать случайные числа в сценариях игрового программного обеспечения Logitech (LGS). Я знаю, что есть

math.random()
math.randomseed()

но дело в том, что мне нужно изменяющееся значение для семени , и решения от других - добавить os.time or tick() or GetRunningTime материал, который НЕ поддерживается в скриптах LGS. Я надеялся, что какая-то добрая душа сможет помочь мне, показав мне кусок кода, который делает чисто случайные числа. Потому что я не хочу псевдослучайных чисел, потому что они случайные только один раз. Мне нужно, чтобы он был случайным каждый раз, когда он запускает команду. Например, если я повторю цикл math.randomI () сто раз, он будет показывать другое число каждый раз. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Этот RNG получает энтропию от всех событий.
Исходное состояние RNG будет отличаться при каждом запуске.
Просто используйте random вместо math.random в вашем коде.

local mix
do
   local K53 = 0
   local byte, tostring, GetMousePosition, GetRunningTime = string.byte, tostring, GetMousePosition, GetRunningTime

   function mix(data1, data2)
      local x, y = GetMousePosition()
      local tm = GetRunningTime()
      local s = tostring(data1)..tostring(data2)..tostring(tm)..tostring(x * 2^16 + y).."@"
      for j = 2, #s, 2 do
         local A8, B8 = byte(s, j - 1, j)
         local L36 = K53 % 2^36
         local H17 = (K53 - L36) / 2^36
         K53 = L36 * 126611 + H17 * 505231 + A8 + B8 * 3083
      end
      return K53
   end

   mix(GetDate())
end

local function random(m, n)  -- replacement for math.random
   local h = mix()
   if m then
      if not n then
         m, n = 1, m
      end
      return m + h % (n - m + 1)
   else
      return h * 2^-53
   end
end

EnablePrimaryMouseButtonEvents(true)

function OnEvent(event, arg)
   mix(event, arg)  -- this line adds entropy to RNG
   -- insert your code here:
   --    if event == "MOUSE_BUTTON_PRESSED" and arg == 3  then
   --       local k = random(5, 10)
   --       ....
   --    end
end
1 голос
/ 19 марта 2019

Наличие другого семени не гарантирует, что у вас будет другое число каждый раз.Это только гарантирует, что у вас не будет одинаковой случайной последовательности при каждом запуске кода.

Простым и наиболее вероятным достаточным решением будет использование позиции мыши в качестве случайного начального числа.

На экране 4K это более 8 миллионов различных возможных случайных семян, и очень маловероятно, что вы достигнете тех же координат в течение разумного времени.Если ваша игра не требует, чтобы вы нажимали одну и ту же позицию снова и снова, пока вы запускаете этот скрипт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...