Lua math.randomseed возвращает то же значение - PullRequest
0 голосов
/ 04 октября 2018

Вот генератор случайных чисел

local hexset = {
    '0', '1', '2', '3', '4', '5', '6', '7',
    '8','9', 'a', 'b', 'c', 'd', 'e', 'f'
}

function random_hex(length)
    math.randomseed(os.time())

    if length > 0 then
        return random_hex(length - 1) .. hexset[math.random(1, #hexset)]
    else
        return ""
    end
end

print(utils.random_hex(32))
print(utils.random_hex(32))
print(utils.random_hex(32))
print(utils.random_hex(32))

4 print дают мне точно такой же RequestSid:

46421938586706fff767d26410f524ee
46421938586706fff767d26410f524ee
46421938586706fff767d26410f524ee
46421938586706fff767d26410f524ee

Я использую это в своем приложении openresty.Я пытался установить math.randomseed(os.time()) один раз на моем верхнем уровне lua тоже.Затем, после 100 одновременных звонков, я получаю около 6 дубликатов гекса.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Возьмите math.randomseed(os.time()) из вашей функции, и она должна нормально работать.

local hexset = {
    '0', '1', '2', '3', '4', '5', '6', '7',
    '8','9', 'a', 'b', 'c', 'd', 'e', 'f'
}

math.randomseed(os.time())

function random_hex(length)
    if length > 0 then
        return random_hex(length - 1) .. hexset[math.random(1, #hexset)]
    else
        return ""
    end
end

print(random_hex(32))
print(random_hex(32))
print(random_hex(32))
print(random_hex(32))
0 голосов
/ 05 октября 2018

math.randomseed сначала получает аргумент и преобразует его в целое число.Интегральная часть os.time() обычно изменяется только раз в секунду, поэтому при таком подходе вы получите одну и ту же последовательность случайных значений в течение одной секунды.

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

...