Программа случайных чисел как работает

К оллеги, в данной статье мы поговорим о генераторе случайных чисел в программах 1С. Для начала выясним, что это вообще такое, где применяется и как работает генератор случайных чисел, а затем рассмотрим, как можно осуществить функцию генерации случайных чисел в системе 1С при помощи программного кода. Также будет приведён пример использования данного инструмента на практике.
Генератор случайных чисел (математики часто его называют генератором псевдослучайных чисел) – это специальный программный алгоритм, при помощи которого создаётся специальная последовательность чисел, в которой зависимость этих самых чисел друг от друга минимальна. При этом, в алгоритме используется, чаще всего, равномерное распределение.
В современном программировании метод генерации случайных чисел применяется очень широко. Например, данная функция применяется в методе моделирования Монте-Карло, в моделировании по имитациям, в криптографии и во многих других областях. При этом качество полученных случайных чисел существенно влияет на качество результата. На эту тему есть известное высказывание математика Роберта Кавью: «Генерация случайных чисел слишком важна, чтобы оставлять её на волю случая».

Генератор случайных чисел. Как разыграть выйгрышные номера


Также стоит отметить, что ни один алгоритм по взаимосвязям не может создать абсолютно случайный числа, так как такой алгоритм лишь аппроксимирует какие-то из их свойств.

2. Генератор случайных чисел в 1С

Рассмотрим генерацию случайных числа в программах 1С:Предприятие. Чтобы получить случайное число, или набор случайных чисел, не обязательно применять сторонние средства, так как в самой платформе 1С уже есть такой инструмент, как генератор случайных значений.
Чтобы сформировать случайные (псевдослучайные) числа в системе есть специальный объект – «ГенераторСлучайныхЧисел». Его можно сделать с помощью конструктора, как демонстрируется на примере программного кода ниже (данная формула является универсальной):


Рис. 1 Создание нового генератора случайных чисел в 1С В данной формуле программы стоит обратить внимание на параметр «НачальноеЧисло». Это некоторая цифра, при помощи которой происходит инициализация функции генератора случайных чисел. Её указание не является обязательным требованием, однако если параметр «НачальноеЧисло» не будет указан, то генератор случайных чисел в 1С будет проходить инициализацию при помощи времени, которое работает операционная система с самого начального момента.
Замечание: для данного параметра также стоит отметить, что прогрессия из генератора случайных значений будет совпадать, если параметр «НачальноеЧисло» один и тот же.
Также объект «ГенераторСлучайныхЧисел» имеет один метод, который выглядит следующим образом:

Рис. 2 Метод генератора случайных чисел в 1С

random. Генерация псевдослучайных чисел на компьютере


Данный метод генерации случайных чисел служит для возвращения целого положительного (или нуля) числа, согласно заданному диапазону: от «НижняяГраница» до «ВерхняяГраница», включая и нижний, и верхний пороги. В случае, если параметры диапазона не будут указаны, то они будут установлены согласно стандартным настройкам: нижнее значение – 0, а верхнее – 4294967295.

3. Пример генерации псевдослучайных чисел

Рассмотрим программный код, указанный на скриншоте с примером ниже, в нём происходит формирование 10-ти случайных чисел, при помощи генератора случайных чисел в программе 1С, с диапазоном от 0 до 100:

Читайте также:
Детская программа подготовка к школе

Рис. 3 Пример генератора случайных значений
Замечание: функцией генератора случайных чисел можно пользоваться только в тонком клиенте, либо на серверной стороне, в иных случаях система 1С будет выводить ошибку.
В данной статье была рассмотрена функция для генерации псевдослучайных чисел в системе 1С, были заданы алгоритм и указан пример.
Специалист компании «Кодерлайн» Айдар Фархутдинов

Источник: www.koderline.ru

Зачем нужны генераторы случайных чисел?

Зачем нужны генераторы случайных чисел?

Вы тоже слышали о генераторах случайных чисел? Такое выражение встречается довольно часто, но мало кто интересуется, что это, на самом деле, такое. Да и, вообще, зачем нужны случайные числа? Если же оглянуться назад, то можно обнаружить, что люди пользуются «случайными числами» на протяжении нескольких последних тысяч лет.

Еще во времена глубокой древности в очагах цивилизации устраивались лотереи и требовалось наделять ценными призами тех, кто угадает случайно совпавшие числа. Даже игра в кости может быть рассмотрена, как примитивный генератор таких чисел с небольшим диапазоном значений.

Случайные числа широко используются и сегодня. Например, в игорном бизнесе, где крайне важна случайность, которую игроки рассматривают, как «перст судьбы». Не менее широко случайные числа используются и в компьютерной технике. Тут спектр их применения крайне широк, а криптография и компьютерные игры это только два частных примера их использования.

Создание надежного протокола шифрования основано на использовании случайных чисел. В этом случае задача хакеров, когда нет возможности предугадать или вычислить кодовую комбинацию, становится не просто сложной, а не имеет решения.

Правила создания криптографической защиты таковы, что использование повторяющихся цифр недопустимо. Кроме того, недопустимо использовать генерацию по неким правилам, ведь в этом случае у «черных программистов» появляется шанс понять работу алгоритма и подменить его. Только последовательность цифр, полученных случайно, может гарантировать безопасное шифрование данных, и является главным условием всех современных алгоритмов.

Типы генераторов случайных чисел

Сейчас известно два типа генераторов случайных чисел. Программные генераторы используют сложные математические алгоритмы. При этом требуется задать некое начальное значение, которое будет точкой отсчета для такого алгоритма. Соответственно, от «точки отсчета» зависит в достаточной степени и конечное значение.

Начальное значение формируется исходя из некоторых параметров компьютера, например, текущего времени или запущенных на ПК приложений и процессов. Это дает ничтожную возможность «просчитать» начальное значение и, соответственно, конечный результат.

Другой тип генераторов случайных чисел представлен аппаратными генераторами TRNG. Их характерным отличием является отсутствие необходимости использования начального значения и то, что в них не используются повторяемые алгоритмы генерации. Такие генераторы называют генераторами истинно случайных чисел, а случайные числа не являются вычисляемыми. Можно сказать, что результат зависит только от внешнего шума. Такие генераторы гораздо более надежны, ведь даже если хакеру удалось узнать одно число, он не имеет никакой возможности предсказать, какими будут остальные числа последовательности.

Случайные числа в нашей жизни

Случайные числа гораздо ближе к нам, чем можно подумать. Наверное каждый, хоть раз, принимал участие в каком-нибудь розыгрыше. Их часто запускают сайты и группы в социальных сетях. Участие ни к чему не обязывает, но дает шанс выиграть приятные и даже ценные призы. Так вот, победители, как правило, определяются администраторами сайтов и групп при помощи генераторов случайных чисел.

Читайте также:
Как сделать фишинг программу

Если же вы, как раз, являетесь админом такого сайта, где проводятся розыгрыши, то у вас возникает заинтересованность в истинно случайном распределении призов. Если аудитория пользователей заподозрит сайт в подтасовке, то оправдаться будет крайне сложно или даже невозможно. Еще большие проблемы могут возникнуть, если кто-то со способностями хакера начнет угадывать призовые комбинации.

Таким образом, нужен надежный генератор случайных чисел, например, https://prozavr.ru/tools/generator_sluchainih_chisel.php.

Возможно, Вы бы хотели читать нас чаще, тогда вот наш Telegram

Он отличается стабильностью работы и простотой интерфейса. Пользователю достаточно задать диапазон значений и тут же получить результат – число, полученное совершенно случайным образом. Генератор может быть полезен и людям, увлекающимся числовыми лотереями. Известно, что призовые комбинации выпадают случайно.

Таким образом, случайные комбинации, вводимые пользователем, имеют все шансы на успех. На сайте представлены числа для лотерей Столото, которыми может воспользоваться каждый.

Источник: itcrumbs.ru

Случайные числа своими руками №1

В этом тексте мы рассмотрим несколько теорий и реализаций генераторов
случайных чисел. Мы так же попробуем определить оптимальный с точки зрения
размера и скорости.

ГПСЧ (PRNG) это генераторы псевдо-случайных чисел.
Никакой детерминированный алгоритм не может генерировать полностью случайные
числа, а только лишь аппроксимировать некоторые свойства случайных чисел.
Ещё Джон фон Нейман говорил, что только лишь арифметическими методами случайное
число получить невозможно. Любой ГПСЧ с ограниченными ресурсами рано или поздно зацикливается. Большинство простых арифметических генераторов хотя и обладают большой
скоростью, но страдают от многих серьёзных недостатков:

  • Слишком короткий период
  • Последовательные значения не являются независимыми
  • Некоторые биты «менее случайны», чем другие
  • Неравномерное распределение
  • Обратимость

В компиляторах широкое распространение получил линейный конгруэнтный метод.
Применяется в простых случаях и не обладает криптографической стойкостью.
Этот алгоритм заключается в итеративном применении следующей формулы:

Этот алгоритм используется в ANSI-C. Рассмотрим его:

#define RAND_MAX 32767

unsigned long next=1;

int rand(void) next=next*1103515245m;
return((unsigned int)(next/65536)2768);
>

void srand(unsigned int seed) next=seed;
>

Где a > 0, c > 0, m > 0 — некоторые целочисленные константы. Получаемая
последовательность зависит от выбора стартового числа X0 и при разных его
значениях получаются различные последовательности случайных чисел. В то же
время, многие свойства последовательности Xk определяются выбором коэффициентов
в формуле и не зависят от выбора стартового числа. Ясно, что последовательность
чисел, генерируемая таким алгоритмом, периодична с периодом, не превышающим m.
При этом длина периода равна m тогда и только тогда, когда:

1) НОД(c,m) = 1 (т.е. c и m взаимно просты);
2) a — 1 кратно p для всех простых p — делителей m;
3) a — 1 кратно 4, если m кратно 4.

При реализации выгодно выбирать m = 2e, где e — число бит в машинном слове,
поскольку это позволяет избавиться от относительно медленной операции
приведения по модулю. Младшие двоичные разряды сгенерированных таким образом случайных чисел
демонстрируют поведение, далёкое от случайного, поэтому рекомендуется
использовать только старшие разряды. Для генерации числа в диапазоне *0 — 2^32 -1* достаточно простого
умножения на мультипликатор и сложения с инкрементом. Деление по модулю
будет произведено автоматически при переполнении. Значения
мультипликатора и инкремента для этого случая получены в исследованиях
D. Knuth и H.W. Lewis.

Читайте также:
Работы на высоте новые правила программы обучения

Они рекомендуют использовать следующие коэффициенты:
a = 1664525, c = 1013904223, m = 2^32

Вот этой формулой рекомендуют пользоваться для генерации 32 битного числа.

Чем мы благодарно и воспользуемся, ниже приведен модуль на ассемблере
использующий линейный конгруэнтный алгоритм.

; ;
; %%%%%%%%%%%%%%%%%%%% ;
; ГЕНЕРАТОР СЛУЧАЙНОГО ЧмСЛА V. 0.3 (x) 2004 СЛОН ;
; Линейный конгруэнтный генератор он не прошёл тест DIEHARD и не ;
; является криптостойким ;
; %%%%%%%%%%%%%%%%%%%% ;
; Интервал: [0..eax-1] ;
; ——————————————— ;
; Использование: call r_init ;
; mov eax,ГРАНИЦА
ИНТЕРВАЛА ;
; call brandom32 ;
; ——————————————— ;
; Результат: число в интервале [0..ГРАНИЦА
ИНТЕРВАЛА] ;
; %%%%%%%%%%%%%%%%%%%% ;

; —[Подпрограмма инициализации генератора случайных чисел]— ;

r_init:
push ebp eax edx ; Сохраняем в стэке
ebp
; eax, edx

call __delta1_ ;
__delta1_: pop ebp ; Получение дельта смещения
sub ebp,offset __delta1_ ;

db 0fh,031h ; Получаем случайное зерно
mov rand_seed,eax ;

После этого используйте MWC() для генерации целого 32 битного числа.
Данная функция имеет период где-то 2^125. Она с лёгкостью прошла тесты DIEHARD
и единственным её недостатком является использование умножения,
которое значительно влияет на скорость работы данного ГПСЧ.

Вот её реализация на ассемблере:

; ;
; %%%%%%%%%%%%%%%%%%%% ;
; ГЕНЕРАТОР СЛУЧАЙНОГО ЧмСЛА V. 0.41 (x) 2005 СЛОН ;
; %%%%%%%%%%%%%%%%%%%% ;
; Интервал: [0..eax-1] ;
; ——————————————— ;
; Используется алгоритм ГПСЧ Джорджа Марсаглии — «Multiply-With-Carry(MWC)»
;
; Данный алгоритм прошёл тест DIEHARD его период 2^125
;
; ——————————————— ;
; Использование: call r_init ;
; mov eax, ГРАНИЦА
ИНТЕРВАЛА ;
; call brandom32 ;
; ——————————————— ;
; Результат: число в интервале [0..ГРАНИЦА
ИНТЕРВАЛА] ;
; %%%%%%%%%%%%%%%%%%%% ;

; —[Подпрограмма инициализации генератора случайных чисел]— ;

r_init:
push ebp eax edx ; Сохраняем в стэке
ebp, eax, edx

call __delta1_ ;
__delta1_: pop ebp ; Получение дельта смещения
sub ebp,offset __delta1_ ;

db 0fh,031h ; Получаем случайное зерно
mov [ebp+x],eax ;

pop edx eax ebp ; Восстанавливаем edx,eax,ebp

ret ; Возврат из подпрограммы

; —[Подпрограмма генерации случаного чмсла в диапазоне]— ;

brandom32: ; Эта подпрограмма
; возвращает
случайное число
; в диапазоне 0..eax-1

push edx ecx ebp ; Сохраняем в стэке
edx, ecx, ebp

call __delta2_ ;
__delta2_: pop ebp ; Получение дельта смещения
sub ebp,offset __delta2_ ;

imul eax,eax,100 ; Умножаем eax на 100
push eax ; и сохраняем eax в стэке

call random32 ; В ызываем подпрограмму
; генерации случайного числа
xor edx,edx ; Обнуляем edx
pop ecx ; Восстанавливаем значение
; из стэка в ecx
div ecx ; Делим eax на ecx
xchg eax,edx ; Помещаем остаток в eax
xor edx,edx ; Обнуляем edx
push 100 ; Помещаем в ecx — 100
pop ecx ;
div ecx ; Делим eax на ecx
pop ebp ecx edx ; Восстанавливаем
ebp, ecx, edx,
ret ; Возврат из подпрограммы

; —[Подпрограмма генерации случайного числа]— ;

random32:
push edx ecx ;
push ebp ; Сохраняем регистры в стэке

call __delta3_ ;
__delta3_: pop ebp ; Получение дельта смещения
sub ebp,offset __delta3_ ;

mov eax,12345678 ;
x = dword ptr $-4 ;
shl eax,0bh
xor eax,[ebp+x]
mov edx,362436069
y = dword ptr $-4
mov [ebp+x],edx
mov ecx,521288629
z = dword ptr $-4
mov [ebp+y],ecx
mov ebx,88675123
w = dword ptr $-4
mov [ebp+z],ebx
mov edx,[ebp+w]
shr edx,13h
xor edx,[ebp+w]
xor edx,eax
shr eax,08h
xor edx,eax
mov [ebp+w],edx
mov eax,edx

pop ebp ;
pop ecx edx ebx

retn ; Возврат из подпрограммы

Источник: xakep.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru