Почему первое случайное число всегда одинаково на некоторых платформах в lua? - PullRequest
5 голосов
/ 20 января 2009

Рассмотрим следующий фрагмент кода lua:

local time = os.time()
for _= 1, 10 do
    time = time + 1
    print('Seeding with ' .. time)
    math.randomseed(time)
    for i = 1, 5 do
        print('\t' .. math.random(100))
    end
end

На компьютере с Linux результат, как и ожидалось, является случайным числом. Но, похоже, по крайней мере в Mac OS X первое случайное число после смены начального числа всегда одинаково!

Полагаю, это связано с тем, что Lua использует функцию C rand () для генерации случайных чисел, но есть ли у кого-нибудь объяснение?

РЕДАКТИРОВАТЬ: вот выдержка из вышеприведенного кода на Linux-машине (т.е. вывод такой, как ожидалось):

$ lua test.lua
Seeding with 1232472273
    69
    30
    83
    59
    84
Seeding with 1232472274
    5
    21
    63
    91
    27
[...]

На компьютере с OS X первое число после «Seeding with ...» всегда было 66.

Ответы [ 5 ]

8 голосов
/ 20 января 2009
4 голосов
/ 20 января 2009

Случайное число Lua, используемое для использования функций C * rand(3) и srand(3) ( см. Здесь ). ОБНОВЛЕНИЕ: более новые версии Lua используйте случайное (3), где доступно .

Как стандарт C90, так и POSIX предлагают кроссплатформенную реализацию rand и srand, которая не является лучшей. Особенно не хватает случайности в младших битах.

Некоторые платформы, такие как Linux, перешли от стандартной рекомендации к лучшей реализации (например, random (3) ).

OS / X остается верным классической реализации rand, и Lua наследует ее.

2 голосов
/ 20 января 2009

Обычно плохая идея вызывать srand несколько раз с семенами, которые численно близки (и особенно плохо это делать со значениями времени). Во многих случаях дисперсия первого случайного числа аналогична дисперсии семян. При работе с языком сценариев, который должен преобразовывать числовые представления, это может быть даже более важно.

Происходит ли то же самое, если вы меняете значение семени на большее количество?

1 голос
/ 21 января 2009

Как уже отмечалось, Lua намеренно использует генератор случайных чисел C90 для удобства переносимости - и C90 RNG не очень хорош.

Если вам нужны хорошие случайные числа, используйте модуль Lua, чтобы получить его. Например, здесь - это связывание Mersenne Twister RNG одним из авторов Lua.

0 голосов
/ 20 января 2009

Если вы используете одно и то же начальное число, вы получите одну и ту же строку чисел из функции C rand (), но вам следует каждый раз получать разную строку чисел, поскольку вы, похоже, используете текущее время в качестве начального числа.

Редактировать: Полагаю, мне следует уточнить мой ответ. Если вы не получаете случайную строку чисел при заполнении с помощью os.time (), возможно, вы не получите то, что ожидаете от вызова этой функции. Какие значения вы получаете от os.time ()?

Редактирование # 2: Кроме того, что выводится из этого блока кода?

...