Спасибо за тёплые слова, но я не вижу возможности ответить кодом на вопрос "проходит ли ГСЧ Wichmann-Hill тесты nist".
Вид для печати
С переездом товарищи ;)
Вы, Бога ради, меня извините, но у меня ощущение, что в детстве/юности, Вас очень сильно огорчила концепция ПЛК в частности, либо Вы довольно толстый тролль.
Либо, самый конченный, и вероятный вариант - Вас обидели и выгнали с хабра.
Вы действительно не понимаете, о чем спорите, или правда некомпетентны? Вы действительно не хотите внимательно прочитать название темы, и первую страницу, или Вам настолько доставляет удовольствие в словоблудии, что это не имеет значения?
после того как у меня на руках появились код метода и код теста, я убедился что xorshift лучше, одного не пойму так трудно было сразу все предоставить, не вижу ни чего зазорного в лужу сесть, если по другому не вытянуть
Еще бы знать где в асутп применить .Эти вытягивания не стоят столько сил и здоровья ...Я всегда говорил - проект в студию ,а потом посмотрим и сравним .А то хаить чужие проекты проще ,когда свои мысли выражаются на другом да же языке программирования ,чем сделать законченый проект .А то получается -я тут идею вам подкинул (на своем языке) ,а вы если надо сами догоняйте на своем языке ..и бесконечные ссылки на википедию .Что создается впечатление ,что человек только что сам прочитал и уже учит других ...Потому и советы,да же хорощие воспринимаются в штыки ...
capzap, учитесь читать. Как не стыдно писать "вытянуть" и "после того как у меня на руках появились код метода и код теста"?
Ссылку на исходный код инструмента NIST и инструмента dieharder я привёл в сообщении 21.
Но нет, наш capzap ленивый, и читает только то, что ему интересно. Разумеется, с какого перепуга он вообще что-то читать должен?
Rovki, который ставит пробелы перед точками и запятыми наперекор лучшим традициям русского языка, вы бы на 142-е лучше ответили. Ну или признались что соврали/ошиблись.
Есть библиотека OSCAT. Там есть генератор случайных значений. Значит кому-то было нужно. Можете идти к авторам OSCAT и с пеной у рта доказывать, что "никомуненужно".
Метод, который предложил сначала Владислав, а потом я проще, быстрее, и случайнее чем то, что в библиотеке OSCAT.
Слабо Владиславу такое написать в ответ на 2-е сообщение?
А какая разница _когда_ я прочитал справочник, если по факту всегда оказываюсь прав?
Вот capzap, другое дело. Смотрит на "процент отклонения от среднего". Это уж точно первый раз открыл справочник, увидел знакомое слово "вероятность", и без включения мозга пошёл писать код.
Мне с ПР дела до оската нет,туда и нелез ,я работал с макросом AI, а ваш так и не увидел ,любитель русским языком чесать ...
сколько угодно можно писать, что я там не включил, что услышал, только я не изменил себе, взял и руками всё попробовал и предложенный Вами мировой опыт и методы от светил статистики. Да разницы особо и нет. Xorshift находит среднее оригинальным способом, относительно нуля а не 0.5. Далее вместо дисперсии ищется интеграл. Разница в один процент между полученной средней и 0.5 как критерий намного жестче, чем erfc
Что же касаетсяда как сказать, в дополнение к этому методу, потребуется генерировать четыре случайных двойных слова,так что по коду там преимуществ ни у кого особых нетЦитата:
а потом я проще, быстрее, и случайнее чем то, что в библиотеке OSCAT
Как случайный зритель отмечу - capzar признал правоту владимира в 174 посте, а владимир опять срывается до неуважительного отношения. Пример "и без включения мозга", как в 176 посте, хорошо это показывает. Знания - знания, но так самоутверждаться...
Знаете лучше - спокойно объясните без нервных срывов. Берите пример с Petera, великий человек. Ни разу не видел подобного отношения даже к самому ''трудному' собеседнику.
ну в общем то пару замеров на ночь глядя не показатель, сегодня при 5000 генераций всё нормально, при 10000 с чего то вдруг переменная sum начала принимать значения в 3 раза больше максимально возможных единиц, хотя среднее показывает как обычно в пределах 0.5, от метода не зависит
ЗЫ выложил еще один генератор, как должен был бы выглядеть генератор от И.Петрова
поясните мне не математику ,что плохого в случайной последовательности чисел ,в которой исключены "склейки" -повторение подряд одинаковых чисел .Я понимаю что такое может быть по теории вероятности ,если бочонки вытащенные из мешка опять бросаются в мешок ,но мне не нужна такая последовательность .Мне нужно ,что бы было как в игре старинной -лото .Вытащил бочонок из кубышки и его уже нет в списке .После последнего бочонка снова тусуем мешок и продолжаем вытаскивать бочонки (но без повторения значений) ...Вот что плохого в таком алгоритме генерации случайного числа? .Количество бочонков в мешке- это диапазон случайных чисел .
Для меня "склейки" на фоне белого шума" это щелчки .
Мало сделать генератор RND (источник) ,который работает на своей частоте (цикла) ,но нужно еще позаботится что бы приемник работал на той же частоте считывания ,что не удобно и не приемлемо с практической точки зрения .Например генератор генерит значения с периодом 1мс , а приемник может работать с периодом 1сек .Тогда может получится совсем другая картинка на входе приемника ...далекая от белого шума ...То есть генератор должен подстраиваться под быстродействие приемника так что бы не нарушалась равновероятность и не было "Склеек".Вот такой генератор может иметь практическое применение .!
О, мнения зрителей, безусловно, интересны. Полагаю, имелось ввиду 173.
Но не считаете ли вы, что порядочный человек должен хотя бы извиниться?
Действительно ли по-вашему достаточно фразы capzap'а "я убедился что xorshift лучше, одного не пойму так трудно было сразу все предоставить, ..., если по другому не вытянуть"?
В #21 было же все предоставлено. Чего тогда человек "вытягивал" на протяжении 21...173?
Я даже пару раз суммировал #74, #113.
0) Для каких-то задач "генератор без повторений" может и потребоваться. Но слепо использовать его для всех задач -- нехорошо.
Если говорить чем "в целом" плох генератор, который выдаёт циклами без повторений, то
1) Плохо то, что он предсказуем. Например, если генерируем числа от 0 до 4, и 0, 1, 2, 3 уже выпали, то с вероятностью 100% выпадет число 4.
2) Плохо то, что нет эффективной реализации для произвольного диапазона. Нет от слова "совсем". Хорошую реализацию можно сделать через массив. Т.е. заполнить его числами от 0 до N, перемешать, и выдавать по одному. На ST это тривиально, а в ОЛ уже проблематично. Но, стоит понимать, что большие массивы держать в памяти и перемешивать всё равно время займёт.
3) Для частных случаев (некоторых N) можно сделать алгоритм не требующий массива, но он при этом будет выдавать лишь часть из возможных перестановок.
rovki, добро пожаловать в мир ПЛК. Тут функциональный блок вызывают тогда, когда нужно. Т.е. генератор и потребитель синхронизированы автоматически. Поэтому то, что пишете в КДС уже есть. Вы же помните, что тема была не в ветке ОЛ, а в ветке КДС2?
В целом, можно и в ОЛ было бы такое же сделать, чтобы часть схемы обрабатывалась только тогда, когда нужно. Например, сделать у макросов "официальный" тактовый вход, и чтобы макрос выполнялся только по фронту сигнала, а, если фронта нет, то чтобы сохранялось старое состояние.
Это шикарно. Поясню, что имею ввиду: capzap оскорбляет фразами "да у Вас комплексы", но при этом никак не подтверждает их. Capzap полностью игнорирует #74 и #113, в которых фраза "capzap, ты неправ" подтверждается конкретными примерами, а не абстрактным "свои срывы".
Цитируйте -- обсудим что было не так с моей стороны.
Жаль, что моё сообщение про "capzap сядет в лужу" удалили (ну, то, я где-то после 138 понял, что float 0..1 получится и capzap зря дискуссию разводит)
0) Не хорошо не приводить расчеты и аргументы ,а только фразы
1)Для меня равновероятно ,имхо -это когда каждое число может выпасть с равной вероятностью .для 1из 10 -10% ,а 1 из 1-100% ,естественно .Тоесть сначала вероятность у всех 10% ,потом 11.1 ,12.5 ,14.3, 16.7 ,20 ,25,33.3,50,100. по сравнению с начальной кучей .Тоесть вероятность растет у оставшихся по сравнению с общей кучей (10шт) ,но между собой они имеют равную вероятность быть выташенными ,что 3 из 3 ,что 5 из 5 каждый имеет равную вероятность .Меня не интересует вероятность оставшихся по сравнению с общей кучей ,меня интересует выроятность вытащенных значений (генерации) между собой .Да, цикл (куча) генерится вновь ,поэтому не 1из 1 остается ,а постоянно 1 из 10
2)использование массивов не представляется возможным при разности скоростей приема\передачи в 10раз ,ни какого стека не хватит ,он переполнится .
насколько я понимаю, раз Ваши комменты удаляют, значит не только у меня есть чувство, что Вы бестактны. Комплексы Ваши сами выходят наружу, это могут видеть все, будь Вы стократ грамотнее вех тут вместе взятых. Цитировать Ваше хамство я не буду, это Ваш удел цепляться ко всему. Я не вижу своей не правоты, до такой степени чтоб извинятся. А по поводу реала, вот когда повторите это для 32 битного слова, тогда и "кричите на весь мир" что поймали меня на не знании законов математики в плк. Кстати про лужу я продублировал если что и без Вашего коммента
Вы показывали работу ПК, а где скрин с реально работающего плк, обрабатывающий генерацию случайных 32-битных чисел, xorshift не проходит тест. Собственно чего это я, опять сейчас услышу, что законы математики везде одинаковы и кому то достаточно результатов на ПК
ЗЫ если побежали проверять на плк, чтоб не было фраз у меня вышло, договаривайте сколько добавили лишних символов в код, не говорю про строки, всё помещается может и в одну
Поясню, что я имею ввиду: по сути, задача "выборки n значений от 0 до n-1 без повторений" эквивалентна задаче "генерации случайной перестановки чисел от 0 до n-1" (по-английски это random shuffle)
1) Задача random shuffle обычно решается через массив: Тасование Фишера–Йетса
Если бы было можно просто "брать и генерировать очередное значение", то такой алгоритм наверняка бы упомянули в wikipedia. Но, нет, там про тасовку значений пишут, что всё-таки нужен массив, и при реализации Фишера–Йетса нужно быть внимательным, т.к. легко ошибиться и тасовка станет очень плохой.
Кстати, в OSCAT функция _ARRAY_SHUFFLE неправильная (там в 2 раза меньше перестановок чем надо, там плохой генератор и т.п.): https://github.com/simsum/oscat/blob...LE.EXP#L27-L34
Следующий момент -- для генерации перестановки большого количества элементов нужен ГСЧ очень высокого качества.
Например, из 1024 элементов есть 1024! перестановок. Для кодирования такого количества нужно log(1024!, 2) бит информации, т.е. примерно 8769 бит.
Это почти в 70 раз больше, чем внутреннее состояние xorshift128. Т.е. нужен либо ГСЧ с большим состоянием, либо нужно эффективно подмешивать энтропию "по ходу генерации". Да, тактование (выборка результата ГСЧ в случайный момент) является одним из таких действий, но тут большой вопрос сколько бит энтропии даёт подобное действо.
Получается, нужно крайне аккуратно следить за ГСЧ, иначе большая часть "возможных перестановок" вообще никогда не будет сгенерирована.
2) Есть ещё второй вариант -- pseudorandom permutation. Более известное как "симметричный шифр".
Например если есть алгоритм шифрования, шифрующий значения 0..63 с помощью ключа K, то "псевдослучайную перестановку" можно получить, если зашифровать значения 0, 1, 2 и т.п. последовательно. Т.е. Encrypt(0, K), Encrypt(1, K), и так далее. Разумеется, после каждого цикла нужно менять ключ шифрования и/или алгоритм шифрования.
Но тут 2 вопроса: во первых, ключ шифрования должен быть немалой длины (ну, чтобы хотя бы в теории закодировать все возможные n! перестановок), а во-вторых, на ум не приходят алгоритмы шифрования, у которых входной-выходной диапазон можно менять как параметр.
Ну, можно найти семейство алгоритмов, которые работают в числах 0...2n-1. В частности, 0..63, но если понадобится генератор "от 0 до 62 без повторений", то нужно будет ещё что-то придумывать.
Например, сработает такой алгоритм (но внутренний цикл while(nextValue>n) неудобно реализовывать на ОЛ):
Код:int n=49; // хотим получить перестановки от 0 до n
int k=42; // ключ шифрования
for(int i=0; i < n; i++) {
int nextValue = Encrypt(i, k); // Считаем, что Encrypt выдаёт значения от 0 до 63
while(nextValue > n) { // Если оказалось 50..63, то значение не подходит -- шифруем его пока не попадёт в диапазон 0..49
nextValue = Enrcypt(nextValue, k); // да, повторно шифруем значение, если оно выходит за диапазон
}
System.out.println("next value = " + nextValue);
}
Для справки, ln(64!)/ln(2) == 296. Т.е. для описания всех возможных 64! перестановок нужно почти 300 бит энтропии.
3) Идея с "давайте просто запоминать выпавшие числа, и если выпадет повторно, то бросать кость заново" понятна, но в ОЛ это убого, и приходится идти на уступки вида "если значение уже было, то возьмём просто следующее свободное". Это самое "следующее свободное" нарушает "случайность" перестановки -- т.е. генератор генерирует biased (как оно по-русски? смещённые? неравномерно распределённые?) последовательности.
Не понимаю зачем вся эта теория...
У меня делается просто, ка говорил rovki: При этом соседние "игры" запросто могут быть одинаковые, или одинаковыми могут быть последний бочонок предыдущей игры и первый следующей, но пока как бочонки не кончатся, повторений не будет!
PS раз вы дописали, то и я допишу... Мой макрос работает по алгоритму описанному в третьем пункте предыдущего сообщения.
Кто может гарантировать ,что в RND сделанном по самому правильному алгоритму в диапазоне 0..N ,нет периодичности (равное расстояние между одинаковыми значениями )появления любого одного числа ???
Например, АНО "Межрегиональный испытательный центр": http://www.stoloto.ru/generator
Ну, я про это же. Эти самые оговорки нарушают "случайность" требуемой перестановки.
Как раз это я и прокомментировал тут:
Поэтому и говорю, что, либо генератор будет плохим, либо там будет массив с "оставшимися элементами".
В ОЛ тяжело сделать "массив на 1024 элемента", поэтому приходится хранить в битах.
Получается на каждом шаге алгоритма нужно генерировать число от 0 до k-1 (где k это количество оставшихся чисел) и уметь выбирать/обнулять нужный k-ый ненулевой бит (если считать, что с самого начала все биты установлены в 1).
Вы готовы называть это "эффективной" реализацией?
5-10 блоков -- я ещё понимаю "эффективная реализация". А когда в ОЛ нужно заводить 32 SEL'а как ячейки памяти для 1024 битов, и потом каждый SEL обвязывать блоком "получи и очисти k-ый ненулевой бит", то это уже "эффективным" я бы не называл. Реализация -- да. Эффективная? Вряд ли.
Плохой работающий (практический) генератор лучше хорошего но неработающего (теоретического)...
Все это делается на лету и хранится текущая и предыдущая переменная в виде стека и анализируются .Получается алгоритм выдачи СЧ с переменным периодом .Так делается сам генератор .Но проблема в скорости считывания ,мы же не в таблицу пишем ,а например выводим на экран 1раз.сек . И вот тогда самый лучщий генератор ,без "склеек" может на индикаторе выдать опять склейки ,только потому что процесс выработки СЧ и отображения СЧ не синхронизированы .
Это как вы будите называть раз в сек СЧ от 0 до 10 ,а я буду выходить из комнаты и появлятся раз в минуту и может быть буду слышать только 2,2,2,2,3,5,5.5,5,1....а генератор все хорошо выдавал ...