21 ноября, 2024

Генератор случайных чисел

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

0.2941509281570384052
0.62395294880670986511
0.32352899500879296587
0.68626970421265163921
0.45571529657587665709
0.96666328709674956501
0.0504861645896251773
0.1070912523275129261
0.22716196443712041884
0.48185595896401983244
0.02211286015447886856
0.046905798959680576

0.0994965807532744378
0.21105214709384573747
0.44768381441546557832
0.94962690713808558473
0.01434859542130714234
0.03043624060767671033
0.06456135357700383794
0.13694754320754054105
0.29049312865183499567
0.61619402449627239282
0.30707076476149299964
0.65135850621207895084
0.38166166337706187053
0.80958072035542363976
0.71728262401792462466
0.52149990206682171384
0.10620559226414221939
0.22528330231069847577
0.47787094086145360679
0.01365983975531539073
0.02897525208897500682
0.06146230473113378446
0.1303738407956809836
0.27654899109579850242

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

Пример кода в 1С:

random

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

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