Алгоритмы рандома
В этой статье вы увидите самые разнообразные велосипеды алгоритмы для генерации случайных чисел.
Про что статья
Про алгоритмы генерирующие псевдослучайные числа, которые отличаются между собой качеством результата и скоростью исполнения. Статья будет полезна тем, кто хочет получить высокопроизводительную генерацию чисел в своих программах или разработчикам софта для микроконтроллеров и старых платформ по типу ZX Spectrum или MSX.
C++ rand
Первое что узнаёт начинающий программист С++ по теме получения рандома — функция rand, которая генерирует случайное число в пределах от 0 и RAND_MAX. Константа RAND_MAX описана в файле stdlib.h и равна 32’767, но этом может быть не так, например в Linux (см. коммент). Если же rand() в вашем компиляторе генерирует числа в пределах 32’767 (0x7FFF) и вы хотите получить случайное число большого размера, то код ниже можно рассматривать как вариант решения этой проблемы:
int64_t A = rand(); A
Реализация функции rand в старом C была проста и имела следующий вид:
Как работает Random в играх
static unsigned long int next = 1; int rand() < next = next * 1103515245 + 12345; return (unsigned int)(next / 65536) % 32768; >
Данная реализация имела не очень хорошее распределение чисел и ныне в C++ улучшена. Так же стандартная библиотека C++ предлагает дополнительные способы получения случайного числа, о которых ниже.
С++11 STL random
Данный сорт рандома появился в C++11 и представляет из себя следующий набор классов: minstd_rand, mt19937, ranlux, knuth_b и разные их вариации.
Чтобы последовательность случайных чисел не повторялась при каждом запуске программы, задают «зерно» псевдослучайного генератора в виде текущего времени или, в случае с некоторыми ретро (и не только) играми — интервалы между нажатиями клавиш с клавиатуры/джойстика. Библиотека random же предлагает использовать std::random_device для получения зерна лучше чем от time(NULL), однако в случае с компилятором MinGW в Windows функция практически не работает так как надо. До сих пор…
// пример, как это использовать: #include #include std::mt19937 engine; // mt19937 как один из вариантов engine.seed(std::time(nullptr)); /* на случай, если у вас UNIX-чё-то или компилятор не MinGW std::random_device device; engine.seed(device()); */ int val = engine(); // так получать рандом
Некоторые из алгоритмов в STL random могут работать быстрее чем rand(), но давать менее качественную последовательность случайных чисел.
PRNG — Pseudo-random Numbers Generator
Можете считать это название — синонимом линейного конгруэнтного метода. PRNG алгоритмы похожи на реализацию rand в C и отличаются лишь константами.
unsigned PRNG() < static unsigned seed = 1; // зерно не должно быть 0 seed = (seed * 73129 + 95121) % 100000; return seed; >
PRNG алгоритмы быстро работают и легки в реализации на многих языках, но не обладают большим периодом.
XorShift
Алгоритм имеющий множество вариаций отличающихся друг от друга периодом и используемыми регистрами. Подробности и разновидности XorShift’а можете посмотреть на Википедии или Хабре. Приведу один из вариантов с последовательностью 2 в 128-й степени.
Что такое рандомный и рандомно?
struct seed_t < unsigned x = 1; // начальные значения могут быть любыми unsigned y = 123; unsigned z = 456; unsigned w = 768; >; unsigned XorShift128() < static seed_t s; unsigned t = s.x^(s.x<<11); s.x = s.y; s.y = s.z; s.z = s.w; s.w = (s.w^(s.w>>19)) ^ (t^(t>>8)); return s.w; >
Данный генератор очень хорош тем, что в нём вообще нет операций деления и умножения — это может быть полезно на процессорах и микроконтроллерах в которых нету ассемблерных инструкций деления/умножения (PIC16, Z80, 6502).
8-bit рандом в эмуляторе z26
Z26 это эмулятор старенькой приставки Atari2600, в коде которого можно обнаружить рандом ориентированный на работу с 1-байтовыми регистрами.
// P2_sreg — static uint8_t void P2_Read_Random() < P2_sreg = (((((P2_sreg > 7) ^ ((P2_sreg > 5)) ^ (((P2_sreg > 4) ^ ((P2_sreg > 3))) ^ 1) | (P2_sreg
Однажды мне пришлось сделать реализацию этого алгоритма для z80:
Ассемблерный код
; рандом с эмулятора z26 ; a — output ; rdseed — 1 байт зерно randz26: exx ld a,(rdseed) and 20h sra a sra a sra a sra a sra a ld h, a ld a,(rdseed) and 80h sra a sra a sra a sra a sra a sra a sra a xor h ld l, h ld a,(rdseed) and 08h sra a sra a sra a ld h, a ld a,(rdseed) and 10h sra a sra a sra a sra a xor h ld h, a ld a, l xor h xor 1 ld h, a ld a,(rdseed) sla a or h ld (rdseed),a exx ret
Компактный рандом для Z80 от Joe Wingbermuehle
Если вам интересно написание программ под машины с зилогом, то представляю вашему вниманию алгоритм от Joe Wingbermuehle (работает только на зилоге):
; By Joe Wingbermuehle ; a res 1 byte — out val ; rdseed res 1 byte — need for rand. != 0 rand8: exx ld hl,(rdseed) ld a,r ld d,a ld e,(hl) add hl,de add a,l xor h ld (rdseed),hl exx ret
Генератор рандома в DOOM
В исходниках игры Дум есть такой интересный файл под названием m_random.c (см. код), в котором описана функция «табличного» рандома, то есть там вообще нет никаких формул и магии с битовыми сдвигами.
Приведу более компактный код наглядно показывающий работу этой функции.
const uint8_t random_map[] = < 4, 1, 63, 3, 64, 22, 54, 2, 0, 52, 75, 34, 89, 100, 23, 84 >; uint8_t get_random() < static uint8_t index = 0; index = (index + 1) // 0xF, потому что столько значений в random_map return random_map[index]; >
Варик для z80
; табличный рандом (как в DOOM) ; rand_table — ссылка на начало массива.
Желательно подключить ; бинарный файл размера 256 байт со случайными цифрами. ; a — output num randtab: exx ; index ld a, (rdseed) inc a ;and filter ; for crop array index ld (rdseed), a ; calc array address ld hl, rand_table ld d, 0 ld e, a add hl, de ld a, (hl) ; get num from arr exx ret
Конечно же это ни какой не рандом и последовательность случайных чисел легко предугадать даже на уровне интуиции в процессе игры, но работает всё это крайне быстро. Если вам не особо важна криптографическая стойкость и вы хотите что-то быстро генерирующее «типа-рандом», то эта функция для вас. Кстати в Quake3 рандом выглядит просто — rand() _rdrand32_step(
Если вы увидите ошибку компиляции, то это значит, что вы не включили флаг -mrdrnd или ваш компилятор/процессор не поддерживает эту инструцию. Возможно это самый быстрый генератор случайных чисел, но есть вопросы в его криптографической стойкости, так что думайте.
Концовка
Класс std::minstd_rand из библиотеки STL random работает быстрее обыкновенного rand() и может стать его альтернативной заменой, если вас не особо волнует длинна периода в minstd. Возможны различия в работе этих функций в Windows и Unix’ах.
Инфа по теме
- Статья рассказывающая о C++11 random и некоторых особенностях работы с ним: Генерация случайных чисел в Modern C++
- Какие вообще есть генераторы в STL random. ссыль
- Вики статья про XorShift с разными реализациями: тык
- Гит эмулятора z26. Код рандома в файле c_pitfall2.c: гит
- Генератор рандома в Думчике: гит
Источник: habr.com
Топ-8 рандомайзеров для конкурсов в соцсетях
Покажите человеку рекламу, и он может вас проигнорировать. Дайте возможность получить подарок – рискует запомнить надолго. Рассказываем, какие сервисы помогут выбрать победителя случайным образом.
Анна Зорина
Автор информационных и коммерческих текстов с 2015 года. Соавтор публикаций в местные СМИ с 2009 года. Автор нескольких рубрик для блога эко-товаров в Инстаграме. More posts by Анна Зорина.
Анна Зорина
1 Sep 2020 • 7 МИН
SMM-специалисты, блогеры, владельцы интернет-магазинов используют разные способы привлечения внимания к страницам в соцсетях. Подробнее узнать об этих инструментах можно на курсе Профессия: SMM-менеджер от SMM.school.
Проведение конкурсов и розыгрышей эффективно вовлекает в процесс как существующих, так и потенциальных клиентов/читателей. Чтобы участники видели вашу честность и прозрачность мероприятия, пользуйтесь проверенными рандомайзерами.
Alpenbot
Описание: профессиональный сервис для конкурсов в Инстаграм*.
Тарифы:
- Базовый бесплатный. Скачает комментарии, проверит отметки друзей и выберет победителя.
- Премиум. Все возможности сервиса. Плата за каждый розыгрыш от 149 р.
- Корпоративный. Все возможности сервиса. Плата за месяц 2000 р.
Соцсети: Инстаграм*.
Что умеет:
- Проверять условия подписки на аккаунт;
- Проверять лайк, отметки друзей и репосты;
- Проверять участников на количество постов, подписок, не бизнес-аккаунт;
- Анализировать количество участников, из них самых активных;
- Анализировать подписки и отписки участников;
- Сохранять результат в вашем аккаунте на сайте.
Что не умеет: сохранять результаты для общего доступа. Для подтверждения честности возвратитесь на страницу конкурса и запишите процесс выбора победителя на видео.
Как пользоваться: Весь процесс от регистрации до выбора победителя выглядит следующим образом.
Сервис предоставляет возможность повторного проведения конкурса к одной публикации Инстаграм*.
Рандомайзер.рф
Описание: генератор чисел Инстаграм*, ВКонтакте, Фейсбук* и в других соцсетях для конкурса.
Тарифы: бесплатен.
Соцсети: любые.
Что умеет:
- Генерировать случайные числа в заданном интервале;
- Сохранять результаты в виде скриншота.
Что не умеет: выгружать комментарии из постов в соцсетях и присваивать им порядковые номера.
Как пользоваться:
Рандомус
Описание: генератор чисел для конкурса на YouTube, в Инстаграм*, Фейсбук* и других соцсетях. Проведение розыгрышей ВКонтакте.
Тарифы: бесплатен. Но убрать рекламу с конкурсных страниц можно за 49 р. разово или за 249 р. на год.
Соцсети: любые.
Что умеет:
- Генерировать случайные числа в заданном интервале;
- Проводить конкурсы для ВКонтакте с постоянной страницей конкурса;
- Осуществлять выбор победителя из списка;
- Проводить розыгрыши генерацией случайных чисел с созданием постоянной страницы конкурса;
- Выбирать случайный ответ, имя, набор знаков для промокодов.
Что не умеет: выгружать комментарии из постов в соцсетях и присваивать им порядковые номера.
Как пользоваться: После регистрации на сайте из личного кабинета создайте любой розыгрыш, конкурс, генерацию случайных чисел.
Генератор случайных Инстаграм*-победителей создается для конкурса в пару минут.
RandomOrg
Описание: простой генератор чисел.
Тарифы: бесплатен.
Соцсети: любые.
Что умеет:
- Генерировать случайное число в заданном интервале;
- Создавать постоянную ссылку на результат.
Что не умеет: выгружать комментарии из постов в соцсетях и присваивать им порядковые номера, проводить розыгрыши «под ключ».
Как пользоваться:
- Введите нужный диапазон чисел.
- Напишите в комментарии название для конкурса.
- Поставьте галочку для создания постоянной ссылки.
- Нажмите «Сгенерировать».
Обязательно пишите комментарий к розыгрышу. Если участники захотят проверить вашу честность дополнительно и перейдут на сайт, то в «последних 100 сгенерированных» смогут найти результат по комментарию.
YoutoGift
Описание: профессиональный сервис для полноценного проведения розыгрышей.
Тарифы: бесплатен.
Соцсети: Инстаграм*, YouTube, ВКонтакте.
Что умеет:
- Генерировать случайное число;
- Проводить конкурсы «в один клик»;
- Создавать отдельную страницу для розыгрыша, ссылку на которую можно разместить даже на сайте;
- Давать возможность участникам проверить списки и найти там себя;
- Отсеивать недобросовестных организаторов конкурсов, используя черный список;
- Проверять условия подписки на аккаунт;
- Проверять лайк, отметки друзей и репосты, комментарии.
Генератор Инстаграм* умеет выбирать победителя не только для конкурса, но также проводить Liketime и Give Away.
На сайте есть подробные видео-инструкции по каждому виду розыгрышей.
Что не умеет: выгружать комментарии из постов в соцсетях и присваивать им порядковые номера, проводить розыгрыши «под ключ».
Как пользоваться: После авторизации в левой части экрана выберите желаемую опцию и следуйте подсказкам сайта.
Залог успешных конкурсов – активная аудитория в группе. Собрать ее поможет парсер Pepper.Ninja. С помощью сервиса можно найти заинтересованных вашей тематикой пользователей, чтобы настроить на них таргетированную рекламу. В том числе – на участников сообществ конкурентов. Об этом писали в статье «Как собрать базу подписчиков конкурентов и поработать с ней на пользу своему бизнесу».
★ Lizaonair
Описание: профессиональный инструмент для проведения конкурсов в соцсетях.
Тарифы:
- Бесплатный;
- Премиум, стоимостью 200 р. за конкурс.
Для бесплатного использования сервиса необходимо отметить ссылку на сервис под видео YouTube либо под/на картинке в Инстаграм*.
Соцсети: Инстаграм*, YouTube, ВКонтакте.
Что умеет:
- Проводить конкурсы «в один клик»;
- Создавать отдельную страницу с результатами розыгрыша (для Инстаграм* и YouTube);
- Выбирать как случайный комментарий, так и уникального автора комментария;
- Отсеивать комментарии владельца страницы/канала;
- Настраивать параметры розыгрыша: подписки, лайки, спонсоры, репосты;
- Проводить розыгрыш по комментариям, по лайкам, по авторам, по хештегам.
Рандомайзер умеет не только проверять стандартный репост в Инстаграм* Истории в течении суток, но и репост, сохраненный в актуальном. Также сервис предоставляет возможность использования своего логотипа на странице розыгрыша.
Что не умеет: генерировать случайные числа, проводить конкурсы где-либо кроме трех соцсетей.
Как пользоваться: для бесплатного проведения розыгрыша авторизируйтесь на сайте и вставьте ссылку на конкурсную страницу.
После нажатия кнопки «Мне повезет!» вы увидите количество лайков, комментариев к посту. Нажатие шестеренки позволит изменить условия выбора победителя.
Если требуется выбрать нескольких участников, нажмите значок обновления справа от победителя.
VerifyShare
Описание: сервис для выбора победителя конкурса в Инстаграм* по комментариям.
Тарифы:
- Бесплатный;
- Для доступа к некоторым функциям – 150 р. за конкурс.
Соцсети: Инстаграм*.
Что умеет:
- Проводить конкурсы без регистрации на сервисе;
- Давать возможность настроить параметры выбора победителя: упоминания, подписки, лайки, репоста в Истории или ленту;
- Фильтровать комментарии по времени;
- Проводить розыгрыш среди комментариев, среди участников, давать больший шанс участникам с наибольшими отметками друзей.
Рандомайзер поможет вам просмотреть подробную статистику конкурса, а также действия отмеченных друзей в комментариях.
Что не умеет: генерировать случайные числа, проводить конкурсы где-либо кроме Инстаграм*.
Как пользоваться: вставьте ссылку на страницу конкурса и следуйте инструкциям сервиса.
Таргет Культиватор
Описание: сервис аналитики и фильтрации данных из ВКонтакте и Инстаграм* с возможностью проведения конкурсов.
Тарифы:
- Конкурсы во ВКонтакте доступны от 50 р. день / 199 р. месяц.
- Конкурсы в Инстаграм* доступны от 290 р./неделя.
Соцсети: Инстаграм*, ВКонтакте.
- Проводить в Инстаграм* конкурсы активности, голосования за посты, а также выбирать случайный комментарий, случайного лайкера;
- Проводить во ВКонтакте конкурсы активности в группе, в посте, а также выбирать победителя по случайному комментарию, лайку, репосту, голосу;
- Проводить конкурсы со сложными условиями.
Помимо выбора победителя, сервис умеет решать много других задач с соцсетями. Например, сервис может выгрузить посты по геотегу Инстаграма* или провести парсинг данных для настройки таргетированной рекламы.
Что не умеет: генерировать случайные числа, проводить конкурсы где-либо кроме Инстаграм* и ВКонтакте, проводить конкурсы «в один клик».
Как пользоваться: после регистрации на сервисе выберите название конкурса, который хотите провести, и следуйте подсказкам системы.
Какой сервис выбрать
Розыгрыш осуществлялся с помощью простого рандомайзера.
Скопировали и пронумеровали все комментарии поста и сгенерировали случайное число
При сложных условиях розыгрыша есть смысл присмотреться к профессиональным сервисам. Например, охваченный в статье сервис Alpenbot пришелся по душе магазину детских товаров «Детский мир». Для участия были условия:
- Подписка на аккаунты двух магазинов;
- Открытая своя страница;
- Отметка в одном комментарии двух друзей, друзья не повторяются.
Сервис Alpenbot сам проверил необходимые условия и показал победителей.
Магазину необходимо лишь записать процесс на видео
Бывает так, что рандомный подход к выбору победителя не подходит. Допустим, вы задумали задание: опубликовать определённое фото с пометкой тега. Либо придумать забавный комментарий к картинке и проголосовать лайком за наиболее понравившийся.
Про такие механики: выбор победителя по тегу или по комментарию, набравшему наибольшее число лайков, читайте в статье «8 бесплатных сервисов для конкурсов в соцсетях» в блоге SMMplanner.
Розыгрыш – шанс привлечь на страницу живых подписчиков. Какой бы способ подведения итогов вы ни выбрали – подберите нужный рандомайзер из нашего топа и осчастливьте участников подарком, услугой или учебным курсом.
Обязательно читайте статьи о конкурсах активности от Тихона Вечерского:
- Гайд по конкурсам активности. 1 часть: настройка
- Гайд по конкурсам активности. 2 часть: запуск
Источник: smmplanner.com
Рандомные программы что это
МЕРОПРИЯТИЯ
QAtalks: Tools приручить» эту самую математику?
13 ресурсов, чтобы выучить математику
Среди разработчиков часто возникают споры о том, необходимо ли изучать математику. Если вас мучает ее незнание, то скорее читайте нашу статью.
4 книги, которые разбудят в вас математика
Программисту без математики никуда, даже если вы еще сомневаетесь в этом. Однако понять ее, не имея необходимых знаний и желания, достаточно сложно.
Источник: proglib.io
Зачем нужны генераторы случайных чисел?
Вы тоже слышали о генераторах случайных чисел? Такое выражение встречается довольно часто, но мало кто интересуется, что это, на самом деле, такое. Да и, вообще, зачем нужны случайные числа? Если же оглянуться назад, то можно обнаружить, что люди пользуются «случайными числами» на протяжении нескольких последних тысяч лет.
Еще во времена глубокой древности в очагах цивилизации устраивались лотереи и требовалось наделять ценными призами тех, кто угадает случайно совпавшие числа. Даже игра в кости может быть рассмотрена, как примитивный генератор таких чисел с небольшим диапазоном значений.
Случайные числа широко используются и сегодня. Например, в игорном бизнесе, где крайне важна случайность, которую игроки рассматривают, как «перст судьбы». Не менее широко случайные числа используются и в компьютерной технике. Тут спектр их применения крайне широк, а криптография и компьютерные игры это только два частных примера их использования.
Создание надежного протокола шифрования основано на использовании случайных чисел. В этом случае задача хакеров, когда нет возможности предугадать или вычислить кодовую комбинацию, становится не просто сложной, а не имеет решения.
Правила создания криптографической защиты таковы, что использование повторяющихся цифр недопустимо. Кроме того, недопустимо использовать генерацию по неким правилам, ведь в этом случае у «черных программистов» появляется шанс понять работу алгоритма и подменить его. Только последовательность цифр, полученных случайно, может гарантировать безопасное шифрование данных, и является главным условием всех современных алгоритмов.
Типы генераторов случайных чисел
Сейчас известно два типа генераторов случайных чисел. Программные генераторы используют сложные математические алгоритмы. При этом требуется задать некое начальное значение, которое будет точкой отсчета для такого алгоритма. Соответственно, от «точки отсчета» зависит в достаточной степени и конечное значение.
Начальное значение формируется исходя из некоторых параметров компьютера, например, текущего времени или запущенных на ПК приложений и процессов. Это дает ничтожную возможность «просчитать» начальное значение и, соответственно, конечный результат.
Другой тип генераторов случайных чисел представлен аппаратными генераторами TRNG. Их характерным отличием является отсутствие необходимости использования начального значения и то, что в них не используются повторяемые алгоритмы генерации. Такие генераторы называют генераторами истинно случайных чисел, а случайные числа не являются вычисляемыми. Можно сказать, что результат зависит только от внешнего шума. Такие генераторы гораздо более надежны, ведь даже если хакеру удалось узнать одно число, он не имеет никакой возможности предсказать, какими будут остальные числа последовательности.
Случайные числа в нашей жизни
Случайные числа гораздо ближе к нам, чем можно подумать. Наверное каждый, хоть раз, принимал участие в каком-нибудь розыгрыше. Их часто запускают сайты и группы в социальных сетях. Участие ни к чему не обязывает, но дает шанс выиграть приятные и даже ценные призы. Так вот, победители, как правило, определяются администраторами сайтов и групп при помощи генераторов случайных чисел.
Если же вы, как раз, являетесь админом такого сайта, где проводятся розыгрыши, то у вас возникает заинтересованность в истинно случайном распределении призов. Если аудитория пользователей заподозрит сайт в подтасовке, то оправдаться будет крайне сложно или даже невозможно. Еще большие проблемы могут возникнуть, если кто-то со способностями хакера начнет угадывать призовые комбинации.
Таким образом, нужен надежный генератор случайных чисел, например, https://prozavr.ru/tools/generator_sluchainih_chisel.php.
Возможно, Вы бы хотели читать нас чаще, тогда вот наш Telegram
Он отличается стабильностью работы и простотой интерфейса. Пользователю достаточно задать диапазон значений и тут же получить результат – число, полученное совершенно случайным образом. Генератор может быть полезен и людям, увлекающимся числовыми лотереями. Известно, что призовые комбинации выпадают случайно.
Таким образом, случайные комбинации, вводимые пользователем, имеют все шансы на успех. На сайте представлены числа для лотерей Столото, которыми может воспользоваться каждый.
Источник: itcrumbs.ru