Показано с 1 по 10 из 239

Тема: Временная тема

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от rovki Посмотреть сообщение
    Вот что плохого в таком алгоритме генерации случайного числа? .Количество бочонков в мешке- это диапазон случайных чисел .
    Для меня "склейки" на фоне белого шума" это щелчки .
    0) Для каких-то задач "генератор без повторений" может и потребоваться. Но слепо использовать его для всех задач -- нехорошо.

    Если говорить чем "в целом" плох генератор, который выдаёт циклами без повторений, то
    1) Плохо то, что он предсказуем. Например, если генерируем числа от 0 до 4, и 0, 1, 2, 3 уже выпали, то с вероятностью 100% выпадет число 4.
    2) Плохо то, что нет эффективной реализации для произвольного диапазона. Нет от слова "совсем". Хорошую реализацию можно сделать через массив. Т.е. заполнить его числами от 0 до N, перемешать, и выдавать по одному. На ST это тривиально, а в ОЛ уже проблематично. Но, стоит понимать, что большие массивы держать в памяти и перемешивать всё равно время займёт.
    3) Для частных случаев (некоторых N) можно сделать алгоритм не требующий массива, но он при этом будет выдавать лишь часть из возможных перестановок.
    Последний раз редактировалось Владимир Ситников; 20.07.2016 в 10:33.

  2. #2
    Пользователь Аватар для rovki
    Регистрация
    03.01.2010
    Адрес
    Чехов
    Сообщений
    12,150

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    0) Для каких-то задач "генератор без повторений" может и потребоваться. Но слепо использовать его для всех задач -- нехорошо.

    Если говорить чем "в целом" плох генератор, который выдаёт циклами без повторений, то
    1) Плохо то, что он предсказуем. Например, если генерируем числа от 0 до 4, и 0, 1, 2, 3 уже выпали, то с вероятностью 100% выпадет число 4.
    2) Плохо то, что нет эффективной реализации для произвольного диапазона. Нет от слова "совсем". Хорошую реализацию можно сделать через массив. Т.е. заполнить его числами от 0 до N, перемешать, и выдавать по одному. На ST это тривиально, а в ОЛ уже проблематично. Но, стоит понимать, что большие массивы держать в памяти и перемешивать всё равно время займёт.
    3) Для частных случаев (некоторых N) можно сделать алгоритм не требующий массива, но он при этом будет выдавать лишь часть из возможных перестановок.
    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раз ,ни какого стека не хватит ,он переполнится .
    Последний раз редактировалось rovki; 20.07.2016 в 11:33.
    электронщик до мозга костей и не только

  3. #3

    По умолчанию

    Цитата Сообщение от rovki Посмотреть сообщение
    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
    rovki, попробуйте понять, что есть 2 различные задачи: "простой ГСЧ" и "ГСЧ без повторений".
    То, что описываете вы (игра лото с бочонками, 5 из 36 и т.п.) это "ГСЧ без повторений".

    Но не надо лезть с этой своей задачей "ГСЧ без повторений" в тему, где обсуждается простой ГСЧ. Это две разные задачи, со своими границами применений.

    Цитата Сообщение от rovki Посмотреть сообщение
    2)использование массивов не представляется возможным при разности скоростей приема\передачи в 10раз ,ни какого стека не хватит ,он переполнится .
    Можете ещё раз объяснить почему "использование массивов не представляется возможным"? Вот не понимаю ваших опасений про "стек переполнится" и "разности скоростей".
    В чём принципиальная проблема выделить 8-128 байт ОЗУ на то, чтобы хранить массив бит?
    От таких объёмов в самом ПР ничего не переполнится. Возможно, получится даже сами числа хранить, т.е. массив чисел (word или dword)

  4. #4
    Пользователь
    Регистрация
    21.01.2011
    Адрес
    еБург
    Сообщений
    890

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    Если говорить чем "в целом" плох генератор, который выдаёт циклами без повторений, то
    1) Плохо то, что он предсказуем. Например, если генерируем числа от 0 до 4, и 0, 1, 2, 3 уже выпали, то с вероятностью 100% выпадет число 4.
    2) Плохо то, что нет эффективной реализации для произвольного диапазона. Нет от слова "совсем".
    А ничего что я уже написал сей макрос?
    Который генерирует число от 0 до n без повторений, где n произвольное, меньше 1024.
    А называется макрос rnd1024.

    PS если есть желание, сам генератор можно легко поменять на ваш, а обработчик массива оставить мой.
    Последний раз редактировалось AI!; 20.07.2016 в 11:49.
    начинающий профессионал

  5. #5

    По умолчанию

    Цитата Сообщение от AI! Посмотреть сообщение
    А ничего что я уже написал сей макрос?
    Который генерирует число от 0 до n без повторений, где n произвольное, меньше 1024.
    А называется макрос rnd1024.
    Поясню, что я имею ввиду: по сути, задача "выборки 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 (как оно по-русски? смещённые? неравномерно распределённые?) последовательности.
    Последний раз редактировалось Владимир Ситников; 20.07.2016 в 12:26.

Похожие темы

  1. Тема для диплома
    от Gordan007 в разделе Трёп (Курилка)
    Ответов: 13
    Последнее сообщение: 18.01.2014, 12:08
  2. Бродит тема..
    от energohran в разделе Разработки
    Ответов: 3
    Последнее сообщение: 10.04.2012, 12:53
  3. МОДУС: тема защиты прошивки
    от Elka в разделе Модус 5684-0
    Ответов: 1
    Последнее сообщение: 28.11.2011, 22:39
  4. Язык ST. Временная задержка.
    от neoarey в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 26.03.2011, 01:15
  5. Ответов: 61
    Последнее сообщение: 12.09.2008, 09:49

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •