Я хорошо осознаю тот факт, что использование одного и того же начального числа дает одинаковую последовательность псевдослучайных чисел. Мой вопрос о том, что при разных начальных числах первое сгенерированное число кажется одинаковым на некоторых платформах.

отрим следующий фрагмент кода 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.

 Sven Lilienthal20 янв. 2009 г., 17:25
Используете ли вы одинаковые версии Lua на обеих машинах? Возможно, ошибка в Mac OS X одна.
 Wookai20 янв. 2009 г., 18:08
Да, я использую последнюю версию lua.

Ответы на вопрос(5)

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

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

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

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

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

 Wookai20 янв. 2009 г., 18:09
Я хорошо осознаю тот факт, что использование одного и того же начального числа дает одинаковую последовательность псевдослучайных чисел. Мой вопрос о том, что при разных начальных числах первое сгенерированное число кажется одинаковым на некоторых платформах.

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

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

Решение Вопроса

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

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

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

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

 Chucky Ellison26 дек. 2015 г., 19:33
Ни один из стандартов C, включая C90, не определяет какую-либо реализацию дляrand или жеsrand, Они просто указывают, что должны делать функции (возвращают псевдослучайные числа). Стандарты включают пример реализации, но примеры не являются нормативными в стандартах ИСО - они не налагают никаких ограничений. Реализации C могут использовать любые версииrand а такжеsrand они хотят, и использование определений, отличных от примера, определенно не "не соответствует". Я предлагаю вам изменить свою формулировку :) (Например,C89).
 Sire26 дек. 2015 г., 15:27
То, что алгоритм «не самый лучший», является преуменьшением;) Он не делает то, что должен, и совершенно бесполезен и сломан. И нет, вы не можете утверждать, что «вы не должны использовать это таким образом», программисты не должны иметь эти знания.
 Matthew Brubaker20 янв. 2009 г., 22:08
Это все еще не объясняет, почему он всегда получает 66 в качестве первого числа, но это хорошая информация.
 orip26 дек. 2015 г., 21:41
@ChuckyEllison достаточно справедливо!

Ваш ответ на вопрос