Nik
можно ли как-то нагенерировать массив из N рандомных чисел в компайл-тайме?
Constantine
эй а где
Vladislav
Nik
Vladislav
Vladislav
читайте правила, пожалуйста
Constantine
Не очень понятен смысл, потому как нужно воспроизводимость компиляции
Anatoly
замечательно, с вакансией к @AlexFails
Александр
Про воспроизводимость не говорили
Александр
Можно для нее вручную сид задавать
Александр
Александр
Если можно реализовать на плюсах
Александр
Причем переносимо
Constantine
Ну а зачем писать в коде компиль тайм генератор, если можно просто вывести файл
Constantine
С данными
Александр
Это костыль, вмешательство в процесс сборки
Constantine
И все переносимо, да
Александр
Я, например, хочу сделать include подобной либы, и больше не париться. А не добавлять себе какие-то батники
Constantine
Constantine
В гите лежит
Constantine
И потом когда выяснится, что вас не устраивают 10% сгенерированных линейным конгруэнтным последовательностей, все будет очень легко
Александр
https://github.com/andrivet/ADVobfuscator/blob/master/Lib/MetaRandom.h
Александр
Зачем делать что-то не на плюсах, если можно на плюсах?
Зачем нам constexpr тогда, если можно на бумажке заранее всё просчитать?
Constantine
Александр
А если распространять эту фичу через либу, просить пользователя в процесс сборки батник добавлять?
Constantine
31 bit pseudo-random number generator
Constantine
Нас учили, что надо использовать генераторы на примерно корне периода
Constantine
2^16 массив генерируем
Constantine
сколько компилироваться будет?)
Александр
Для больших массивов - да, согласен
Constantine
да, еще вопрос - а безымянный namespace законный в .h файлах?
Constantine
мне казалось, что использование элемента безымянного неймспейса в таком шаблоне будет просто ODR violation
Дмитрий ⬡
Это такой inline на блок
Vladislav
Constantine
это еще зачем?
потому что как правило матановое качество генератора доказывается начиная с корня периода
Constantine
для линейного конгруэнтного - точно
Vladislav
а где у периода корень?) он на то и период что замкнут, то есть без начала и конца
Vladislav
либо я тебя не понял
Constantine
Vladislav
но от чего нужно на этот корень отступить?
Constantine
т.е. сгенерированная выборка должна иметь размер хотя бы порядка корня периода
Vladislav
для каких целей?
Constantine
да для любых
Constantine
на меньших сгенерированных выборках можно просто огрести
Vladislav
но что это значит, если мне нужно 100 бит?
Vladislav
что мне нужен генератор с периодом 10000 бит, а больше не подойдет?
Constantine
что не надо использовать линейный конгруэнтный mod 2^64 с сидом 1
Vladislav
то есть нужно отступить на корень от "плохих" сидов? Уже лучше, осталось понять, какие сиды считаются плохими
Constantine
Constantine
т.е. 100 бит надо генерировать с mod 10000
Vladislav
звучит палевно, где-то можно про это почитать?
Constantine
посмотри как оценки считаются
Constantine
там есть сведение генератора к экспоненциальным суммам
Constantine
я не воспроизведу на ходу
Constantine
но там что-то вроде оценки \sum w_N ^ { g_i } <= 2 sqrt N
Vsevolod
взять xoroshiro, и не париться
Vsevolod
зачем LCG?
Vladislav
посмотри как оценки считаются
теоретические оценки может и считаются только на больших выборках, но на практике я ни разу не слышал совет брать генератор с меньшим периодом
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
Vsevolod
хм
Vsevolod
если этот код заменить на return 2*(x/x); то становится забавнее
Vsevolod
там выбивается icc
Vsevolod
если заменить int на float, то очень забавен вариант шланга
Constantine