Быстрый поиск
Введите фрагмент названия статьи для поиска
Генерация случайных значений на PHP с заданной вероятностью
11.01.2019 | Категория: Web-мастеру и не только | Автор: ManHunter
Понадобилась функция, которая возвращает случайный элемент из определенного набора. Вроде бы простейшее решение в одну строчку. Но особенность задачи такова, что элементы должны появляться не просто случайно, а с определенной вероятностью: какие-то чаще, какие-то реже. То есть у каждого значения имеется весовой коэффициент, влияющий на частоту его появления. Например:Code (PHP) : Убрать нумерацию
- // Массив значений и весовых коэффициентов
- $data=array(
- 'купить'=>50,
- 'заказать'=>5,
- 'приобрести'=>30,
- );
Code (PHP) : Убрать нумерацию
- //-------------------------------------------------------------
- // Получение случайного значения с заданной вероятностью
- //-------------------------------------------------------------
- function smart_rand($data) {
- // Пустой массив не обрабатываем
- if (count($data)==0) { return false; }
- // Отсортировать массив с сохранением ключей
- arsort($data);
- // Сформировать массив с интервалами
- $max_rand=0;
- $weights=array();
- foreach ($data as $key=>$value) {
- $max_rand+=$value;
- $weights[$max_rand]=$key;
- }
- // Случайное число от 0 до суммы всех весовых коэффициентов
- $rand=mt_rand(0,$max_rand);
- // Найти интервал, в который попадает случайное число
- foreach ($weights as $key=>$value) {
- if ($rand<=$key) {
- break;
- }
- }
- return $value;
- }
Code (PHP) : Убрать нумерацию
- // Вывести 100 вариантов написания
- for($i=0; $i<100; $i++) {
- echo smart_rand($data).' ';
- }
Просмотров: 2018 | Комментариев: 1
Генератор случайных чисел с использованием RANDOM.ORG
25.10.2016 | Категория: Образ мышления: Assembler | Автор: ManHunter
Генератор случайных чисел с использованием RANDOM.ORG
Тема генераторов случайных чисел является одной из основных в криптографии. Использование любых программных генераторов случайных чисел имеет один главный недостаток: последовательность чисел может называться случайной только если между символами, нету зависимости. А любой алгоритм так или иначе подразумевает зависимость от вычислений. Истинно случайные числа получаются только от аппаратных генераторов. Одним из таких генераторов является сайт RANDOM.ORG. По заявлению его владельцев, источником для случайных чисел является атмосферный шум. Не берусь утверждать, так это или нет, но этот сайт пользуется заслуженной популярностью среди разработчиков всего мира.
Читать статью целиком »
Просмотров: 3878 | Комментариев: 11
Генерация последовательности уникальных кодов на PHP
12.10.2013 | Категория: Web-мастеру и не только | Автор: ManHunter
Иногда возникает задача генерации последовательности уникальных кодов по определенному формату. Это могут быть какие-нибудь одноразовые токены, коды лотерейных билетов, серийные номера, scratch-карты, да мало ли чего. Простое использование ГСЧ в этом случае не дает 100% гарантии, так как выдаваемые им значения могут повторяться, а при большом количестве кодов количество повторений будет только расти. Предлагаю вам следующее решение:Code (PHP) : Убрать нумерацию
- // Набор символов для генерации кодов
- $str='1234567890ABCDEF';
- // Длина кода без учета разделителей
- $code_length=16;
- // Нужное количество кодов
- $codes_count=300000;
- // Позиции разделителя (0 - не надо)
- $code_separartor=4;
- $tmp=array();
- $str_length=strlen($str)-1;
- // Цикл до заполнения массива
- while (count($tmp)<$codes_count) {
- // Сгенерировать индекс массива
- $code='';
- for ($i=0; $i<$code_length; $i++){
- // Разделитель можно не добавлять
- if ($i>0 && $code_separartor>0 && $i%$code_separartor==0) { $code.='-';}
- $code.=substr($str, mt_rand(0,$str_length), 1);
- }
- // Или в массив добавится новый элемент, или
- // перепишется поверх уже имеющийся
- $tmp[$code]=1;
- }
- // Теперь в массиве $codes уникальные коды
- $codes=array_keys($tmp);
Читать статью целиком »
Просмотров: 11544 | Комментариев: 6
Еще один генератор случайных чисел на Ассемблере
17.05.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
В закромах Родины нашлась реализация еще одного генератора случайных чисел. Он более громоздкий, чем минимальный генератор Парка-Миллера, использует операции с плавающей точкой и кольцевой буфер, но результаты выдает гораздо лучше. Кроме большого кода ему также требуется больше места и в сегменте данных:Code (Assembler) : Убрать нумерацию
- section '.data' data readable writeable
- ; Данные для генератора случайных чисел
- JJ = 10 ; lag 1
- KK = 17 ; lag 2, size of circular buffer
- R1 = 19 ; rotate count
- R2 = 27 ; rotate count
- randp1 dt 1.5 ; used for conversion to float
- dw 0 ; alignment
- p1 dd 0 ; pointer in circular buffer
- p2 dd 0 ; pointer in circular buffer
- randbuf dd (2*KK) dup(?) ; circular buffer
Code (Assembler) : Убрать нумерацию
- ; Инициализация генератора случайных чисел
- invoke GetTickCount
- stdcall WRandomInit,eax
- ...
Читать статью целиком »
Просмотров: 11499 | Комментариев: 10
Генератор случайных чисел на Ассемблере
03.09.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
При написании программ часто возникает необходимость получить последовательность случайных чисел. В языках высокого уровня существуют штатные функции, а для Ассемблера я использую так называемый "Минимальный генератор Парка-Миллера" (Minimal portable random generator by Park and Miller). От аналогичных алгоритмов его отличает очень малый размер и равномерное распределение получаемых случайных чисел. Математическую модель и описание работы алгоритма можно без труда найти в интернете, поэтому эту информацию я здесь не привожу.Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Park Miller random number algorithm
- ; Получить случайное число 0 ... 99999
- ; stdcall WRandom
- ; на выходе EAX - случайное число
- ;---------------------------------------------
- proc WRandom
- push edx ecx
- mov eax,[random_seed]
- xor edx,edx
- mov ecx,127773
- div ecx
- mov ecx,eax
- mov eax,16807
- mul edx
- mov edx,ecx
- mov ecx,eax
- mov eax,2836
- mul edx
- sub ecx,eax
- xor edx,edx
- mov eax,ecx
- mov [random_seed],ecx
- mov ecx,100000
- div ecx
- mov eax,edx
- pop ecx edx
- ret
- endp
- ;---------------------------------------------
- ; Получить случайное число в нужном интервале
- ; Требуется процедура WRandom
- ; stdcall WIRandom,min,max
- ; на выходе EAX - случайное число
- ;---------------------------------------------
- proc WIRandom rmin:dword,rmax:dword
- push edx ecx
- mov ecx,[rmax]
- sub ecx,[rmin]
- inc ecx
- stdcall WRandom
- xor edx,edx
- div ecx
- mov eax,edx
- add eax,[rmin]
- pop ecx edx
- ret
- endp
- ;---------------------------------------------
- ; Инициализация генератора случайных чисел
- ; stdcall WRandomInit
- ;---------------------------------------------
- proc WRandomInit
- push eax edx
- rdtsc
- xor eax,edx
- mov [random_seed],eax
- pop edx eax
- ret
- endp
Читать статью целиком »
Просмотров: 31252 | Комментариев: 7