Nik
можно ли как-то нагенерировать массив из N рандомных чисел в компайл-тайме?
Constantine
можно ли как-то нагенерировать массив из N рандомных чисел в компайл-тайме?
vector<int> get_random_sequence() { return { 1, 5, 3, 6, 6, 4 }; } //made with fair dice roll
Constantine
эй а где
Vladislav
эй а где
бот спит
Александр
можно ли как-то нагенерировать массив из N рандомных чисел в компайл-тайме?
Сид можно вытащить из __TIME__, а дальше линейный конгруэнтный генератор..
Vladislav
читайте правила, пожалуйста
Constantine
Не очень понятен смысл, потому как нужно воспроизводимость компиляции
Anatoly
замечательно, с вакансией к @AlexFails
Александр
Про воспроизводимость не говорили
Constantine
Про воспроизводимость не говорили
Я просто плохо понимаю, что мешает сделать батник
Александр
Можно для нее вручную сид задавать
Александр
Если можно реализовать на плюсах
Александр
Причем переносимо
Constantine
Ну а зачем писать в коде компиль тайм генератор, если можно просто вывести файл
Constantine
С данными
Александр
Это костыль, вмешательство в процесс сборки
Constantine
И все переносимо, да
Constantine
Это костыль, вмешательство в процесс сборки
Зато решает все проблемы, компилируется везде, всегда и так далее
Александр
Я, например, хочу сделать include подобной либы, и больше не париться. А не добавлять себе какие-то батники
Constantine
В гите лежит
Constantine
И потом когда выяснится, что вас не устраивают 10% сгенерированных линейным конгруэнтным последовательностей, все будет очень легко
Александр
https://github.com/andrivet/ADVobfuscator/blob/master/Lib/MetaRandom.h
Александр
Зачем делать что-то не на плюсах, если можно на плюсах? Зачем нам constexpr тогда, если можно на бумажке заранее всё просчитать?
Constantine
Зачем делать что-то не на плюсах, если можно на плюсах? Зачем нам constexpr тогда, если можно на бумажке заранее всё просчитать?
Ну и теперь вы получили +1..10 секунд времени к сборке, кучу мусора и еще надо изучать свойства генератора под задачу
Александр
А если распространять эту фичу через либу, просить пользователя в процесс сборки батник добавлять?
Constantine
31 bit pseudo-random number generator
Constantine
Нас учили, что надо использовать генераторы на примерно корне периода
Constantine
2^16 массив генерируем
Constantine
сколько компилироваться будет?)
Александр
Для больших массивов - да, согласен
Constantine
да, еще вопрос - а безымянный namespace законный в .h файлах?
Constantine
мне казалось, что использование элемента безымянного неймспейса в таком шаблоне будет просто ODR violation
Egor
да, еще вопрос - а безымянный namespace законный в .h файлах?
Но в чём смысл? Зачем создавать какую-то штуку отдельно на каждую _единицу трансляции_?
Дмитрий ⬡
Это такой inline на блок
Constantine
это еще зачем?
потому что как правило матановое качество генератора доказывается начиная с корня периода
Constantine
для линейного конгруэнтного - точно
Vladislav
а где у периода корень?) он на то и период что замкнут, то есть без начала и конца
Vladislav
либо я тебя не понял
Vladislav
но от чего нужно на этот корень отступить?
Constantine
т.е. сгенерированная выборка должна иметь размер хотя бы порядка корня периода
Vladislav
для каких целей?
Constantine
да для любых
Constantine
на меньших сгенерированных выборках можно просто огрести
Vladislav
но что это значит, если мне нужно 100 бит?
Vladislav
что мне нужен генератор с периодом 10000 бит, а больше не подойдет?
Constantine
что не надо использовать линейный конгруэнтный mod 2^64 с сидом 1
Vladislav
то есть нужно отступить на корень от "плохих" сидов? Уже лучше, осталось понять, какие сиды считаются плохими
Constantine
то есть нужно отступить на корень от "плохих" сидов? Уже лучше, осталось понять, какие сиды считаются плохими
нет, то есть если ты используешь линейный конгруэнтный mod N будь добр использовать выборки длиной sqrt(N) :)
Constantine
т.е. 100 бит надо генерировать с mod 10000
Vladislav
звучит палевно, где-то можно про это почитать?
Constantine
посмотри как оценки считаются
Constantine
там есть сведение генератора к экспоненциальным суммам
Constantine
я не воспроизведу на ходу
Constantine
но там что-то вроде оценки \sum w_N ^ { g_i } <= 2 sqrt N
Vsevolod
взять xoroshiro, и не париться
Vsevolod
зачем LCG?
Constantine
взять xoroshiro, и не париться
я не изучал вопрос по конкретным генераторам и их косякам
Vladislav
посмотри как оценки считаются
теоретические оценки может и считаются только на больших выборках, но на практике я ни разу не слышал совет брать генератор с меньшим периодом
Constantine
взять xoroshiro, и не париться
это генератор на М- последовательностях? у него тоже корень периода
Vladislav
и вообще, о каких конкретно оценках идет речь?
Constantine
ну смотри
Vsevolod
LFSR
Constantine
вот пусть у тебя числа [0..N-1] генерируются
Constantine
давай будем считать сумму w_N ^ { a_i }
Constantine
где w_N примитивный корень степени N
Vladislav
лол, на вики есть противоположное утверждение: For related reasons, any PRNG should have a period longer than the square of the number of outputs required.
Vladislav
https://en.wikipedia.org/wiki/Linear_congruential_generator#Advantages_and_disadvantages
🐙 Antony
а там пацаны расскажут, что да как
ссылочку на тикет скинь, интеренсо посмотреть коментарии от разрабов
🐙 Antony
и не спрашивай меня, почему sort всё сломал
sort у GCC часто ломает оптимизации. Скорее всего связано с https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82394 (плохо оптимизируют итераторы)
Vsevolod
хм
Vsevolod
если этот код заменить на return 2*(x/x); то становится забавнее
Vsevolod
там выбивается icc
Vsevolod
если заменить int на float, то очень забавен вариант шланга