Отправляет email-рассылки с помощью сервиса Sendsay

Школа 1С

  Все выпуски  

Школа 1С: Игра случая (#57)


Школа 1С
Выпуск 57

Игра случая

Здравствуйте, дорогие подписчики!

Возможно, некоторые из вас уже слышали о старте проекта 1CV8GAMES, в рамках которого создаются и бесплатно распространяются игры для программ системы «1С:Предприятие 8». В настоящее время сайт проекта (www.1cv8games.ru) работает в так называемом промо-режиме, однако, уже в апреле общественности будут представлены первые игры.

Этот выпуск нашей рассылки «Школа 1С» подготовлен совместно с командой 1CV8GAMES, и в нем один из участников этого проекта – Евгений Огнев – делится с нашими читателями опытом создания и использования на платформе «1С:Предприятие» (версий 7.7, 8.0 и 8.1), пожалуй, ключевого элемента многих игр – генератора псевдослучайных чисел.

Такой генератор мог бы пригодиться вам и в том случае, если вы создаете, например, систему контроля знаний (как конфигурация «Экзаменатор» на платформе «1С:Предприятие 7.7», выпущенная фирмой «1С» еще в 2001 году) или модуль профессионального и/или психологического тестирования для HR-решения (как продукт «Оценка профессионально важных качеств» для платформы «1С:Предприятие 8.1», разработанный фирмой «Агентство «1С-Персонал»).

Впрочем, слово Евгению:

 

Вступление

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

Целью этого выпуска не является обсуждение качества ГПСЧ или их математических основ, заинтересованных в этом отсылаю в модную нынче Википедию или к классической книге Дональда Кнута «Искусство программирования». Я же преследую сугубо практическую цель – рассказать об использовании ГПСЧ во встроенном языке программирования системы «1С:Предприятие».

 

1С:Предприятие 7.x

В языке программирования системы «1С:Предприятие 7.x» (7.0, 7.5 и 7.7) нет встроенного ГПСЧ. Поэтому за псевдослучайными числами приходится обращаться к внешним источникам или реализовывать ГПСЧ своими силами.

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

б) скриптовые языки Windows
Программа «1С:Предприятие 7.x» работает в среде Microsoft Windows, современные версии этой системы имеют поддержку скриптовых языков (например, VBScript или JScript), возможности которых в ряде случаев превышают возможности встроенного языка платформы «1С:Предприятие», в частности имеют встроенный генератор псевдослучайных чисел. К счастью, у нас есть возможность вызывать функции скриптовых языков Windows из среды «1С:Предприятие».

Например, в версии 7.7 системы «1С:Предприятие» реализация ГПСЧ может выглядеть следующим образом:

Перем Скрипт; // переменная для доступа к функциям скриптового языка


// процедура инициализирует ГПСЧ
// ключевое слово "Экспорт" нужно только для Глобального модуля
Процедура ИнициализироватьГПСЧ(НачальноеЧисло=0) Экспорт

      Попытка
            Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
            Скрипт.language = "VBScript";
            
            // прокручиваем первые числа последовательности
            Для Инд=1 по Число(НачальноеЧисло) Цикл
                  Скрипт.eval("rnd()");
            КонецЦикла;
      Исключение
            Скрипт = 0;
      КонецПопытки;

КонецПроцедуры


// функция возвращает целое псевдослучайное число из интервала [0; Предел),
// при неинициализированном ГПСЧ всегда возвращает 0
// ключевое слово "Экспорт" нужно только для Глобального модуля
Функция ПолучитьСлучайноеЧисло(Предел=1) Экспорт
      
      СлучайноеЧисло = ?(ПустоеЗначение(Скрипт)=1, 0, Скрипт.eval("rnd()")*Предел);
      
      Возврат Цел(СлучайноеЧисло);
     
КонецФункции

А использование ГПСЧ так:

      ИнициализироватьГПСЧ(СтрЗаменить(ТекущееВремя(), ":", ""));
      
      Для Инд=1 по 20 Цикл
            Сообщить(ПолучитьСлучайноеЧисло(100));
      КонецЦикла;

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

в) собственная реализация
Если вам по каким-то причинам не подходят описанные выше способы, то все равно всегда остается возможность реализовать ГПСЧ своими силами. Для этого можно использовать любую из формул, применяемых в линейном конгруэнтном методе. Тогда собственная реализация ГПСЧ в системе «1С:Предприятие 7.7» может выглядеть так:

Перем К1,К2,К3; // коэффициенты формулы линейного конгруэнтного метода
Перем СЧ; // последнее псевдослучайное число


// процедура инициализирует ГПСЧ
// ключевое слово "Экспорт" нужно только для Глобального модуля
Процедура ИнициализироватьГПСЧ(НачальноеЧисло=0) Экспорт
      
      К1 = 25173; К2 = 13849; К3 = 65536;
      СЧ = НачальноеЧисло;

КонецПроцедуры


// функция возвращает целое псевдослучайное число из интервала [0; Предел)
// ключевое слово "Экспорт" нужно только для Глобального модуля
Функция ПолучитьСлучайноеЧисло(Предел=1) Экспорт
                                          
      СЧ = (СЧ * К1 + К2) % К3;
      
      Возврат Цел(СЧ / К3 * Предел);
     
КонецФункции

Используется такой ГПСЧ так же, как и в предыдущем примере.

 

1С:Предприятие 8.0

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

Сам по себе GUID – это статистически уникальное 128-битное число, которое в значительной степени можно считать случайным. Последовательность GUID вполне можно использовать как основу для собственного ГПСЧ. Например, это может выглядеть так:

////////////////////////////////////////////////////////////////////////////////
// Функция ПолучитьСлучайноеЧисло()
// параметры: Предел - натуральное (целое, положительное) число
// назначение: возвращает случайное целое число в интервале [0, Предел)
Функция ПолучитьСлучайноеЧисло(Предел) Экспорт
      
      СлучайноеЧисло   = 0;
      ПравильныйПредел = Цел(Предел);
      
      Если ПравильныйПредел>0 Тогда
            ГУИД = Строка(Новый УникальныйИдентификатор);
            Шестнадцатиричное = ВРег(СокрЛП(СтрЗаменить(ГУИД, "-", "")));
      
            БазовоеЧисло = 0;
            Для Инд=1 по СтрДлина(Шестнадцатиричное) Цикл
                  Символ = Сред(Шестнадцатиричное, Инд, 1);
                  
                  Цифра  = ?(Символ="A", 10,
                           ?(Символ="B", 11,
                           ?(Символ="C", 12,
                           ?(Символ="D", 13,
                           ?(Символ="E", 14,
                           ?(Символ="F", 15,
                           Число(Символ)))))));
                              
                  БазовоеЧисло = БазовоеЧисло*16 + Цифра;
            КонецЦикла;
            
            СлучайноеЧисло = БазовоеЧисло % ПравильныйПредел;
      КонецЕсли;
      
      Возврат СлучайноеЧисло;
     
КонецФункции //ПолучитьСлучайноеЧисло

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

 

1С:Предприятие 8.1

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

Использовать его можно следующим образом:

      ГПСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло);
      СЧ   = ГПСЧ.СлучайноеЧисло(0, Предел);

Этот генератор псевдослучайных чисел обладает описанным выше свойством повторяемости, для этого надо при создании объекта использовать одно и то же начальное число. Можно начальное число не задавать, в этом случае ГПСЧ инициализируется временем работы операционной системы с момента старта. Еще одним его полезным свойством является возможность указывать нижнюю (в примере – 0) и верхнюю (в примере – Предел) границу диапазона, в котором будет очередное сгенерированное псевдослучайное число.

 

Выпуск подготовил: Евгений Огнев
Редактор: Владислав Аврутин
Автор рассылки: Алексей Куприйчук


В избранное