Вверх ↑
Пакеты 
HiAsm4
Windows 
Компоненты 
Лoгикa - Random

Random
Краткое описание
   Генератор псевдослучайной числовой последовательности.
Параметры
  • Min - Определяет минимальное случайное число
  • Max - Определяет максимальное случайное число
  • Mode - Определяет тип распределения: дискретный/непрерывный
  • Quality - Алгоритм Генератора-Псевдо-Случайных-Чисел. По умолчанию - Simple. Простой линейный конгруэнтный метод. Более сложный (и менее быстрый) - Xorshift128 Джорджа Марсаглии. Данный алгоритм прошел тест DIEHARD его период 2^128-1
  • Методы
  • doRandom - Генерирует следующее случайное число
  • doRandomize - Переустанавливает генератор случайных чисел (инициализация, если при каждом запуске необходим новый ряд случайных чисел)
  • doRandSeed - Предопределяет последовательность случайных чисел целым числом для режима Simple. И - последовательностью 32-Х HEX-цифр (текст), для режима Xorshift128
  • doRandomWithoutRepeats - Генерирует полную случайную последовательность неповторяющихся целых чисел в диапазоне от Min до Max. Таким образом, событие onRandom активизируется (Max-Min+1) раз на один вызов метода doRandomWithoutRepeats
  • События
  • onRandom - Событие происходит всякий раз при генерации случайного числа и выдает в поток само число
  • Свойства
  • Random - Хранит последнее значение генератора
  • RandSeed - Хранит текущее значение идентификатора последовательности случайных чисел. Целое число для режима Simple, и последовательность 32-Х HEX-цифр (текст), для режима Xorshift128.
  • Данные
  • Min - Определяет минимальное случайное число (параметр Min), при выполнении метода doMin
  • Max - Определяет максимальное случайное число (параметр Max), при выполнении метода doMax
  • Примеры
       Пример использования компонента Random
    
    Add(Memo,16063186,413,70)
    {
    Left=42
    Top=63
    Width=102
    Height=232
    ScrollBars=2
    }
    Add(Random,3122397,343,70)
    {
    Max=10
    link(onRandom,16063186:doAdd,[])
    }
    Add(Button,14674583,252,70)
    {
    Left=45
    Top=19
    Width=97
    Height=34
    Caption="doRandom"
    link(onClick,3122397:doRandom,[])
    }
    Add(Random,15909201,343,147)
    {
    Max=10
    Point(doRandomWithoutRepeats)
    link(onRandom,7412686:doWork2,[])
    }
    Add(Memo,3997962,413,147)
    {
    Left=182
    Top=63
    Width=95
    Height=232
    ScrollBars=2
    }
    Add(Button,9071412,252,175)
    {
    Left=187
    Top=19
    Width=90
    Height=34
    Caption="doRandom WithoutRepeats"
    Data=String(
    ) link(onClick,7541107:doEvent1,[]) } Add(Hub,7541107,301,175) { link(onEvent1,15909201:doRandomWithoutRepeats,[(326,181)
    Замечания
    Краткое описание
    [tab] Генератор псевдослучайной числовой последовательности.
    Параметры
    [*] [color=blue]Min[/color] - Определяет минимальное случайное число [*] [color=blue]Max[/color] - Определяет максимальное случ
    Методы
    [*] [color=blue]doRandom[/color] - Генерирует следующее случайное число [*] [color=blue]doRandomize[/color] - Переустанавливае
    События
    [*] [color=blue]onRandom[/color] - Событие происходит всякий раз при генерации случайного числа и выдает в поток само число
    Свойства
    [*] [color=blue]Random[/color] - Хранит последнее значение генератора [*] [color=blue]RandSeed[/color] - Хранит текущее значени
    Данные
    [*] [color=blue]Min[/color] - Определяет минимальное случайное число (параметр Min), при выполнении метода doMin [*] [color=blu
    Примеры
    [tab] Пример использования компонента Random [code] Add(Memo,16063186,413,70) { Left=42 Top=63 Width=102 Height=232
    )
    link(onClick,7541107:doEvent1,[])
    }
    Add(Hub,7541107,301,175)
    {
    link(onEvent1,15909201:doRandomWithoutRepeats,[(326,181)(326,174)])
    link(onEvent2,7412686:doWork3,[(396,188)])
    }
    Add(HubEx,7412686,392,147)
    {
    link(onEvent,3997962:doAdd,[])
    }
    Add(MainForm,16689738,252,119)
    {
    Width=331
    Height=347
    Caption="Пример использования Random"
    link(onCreate,3122397:doRandomize,[(291,139)(291,83)])
    }

       Пример использования компонента Random для генерации не повторяющейся последовательности случайных чисел от 0 до 99 (метод "удаления строк")
    
    Add(MainForm,12222001,203,126)
    
    {
    Caption="Сортировка методом "удаления строк""
    link(onCreate,6051152:doEvent1,[])
    }
    Add(StrList,7129927,581,133)
    {
    Point(doGetString)
    Point(onGetString)
    link(onGetString,2122520:doAdd,[])
    }
    Add(Random,77841,497,161)
    {
    Max=99
    Point(doMax)
    link(onRandom,11152764:doEvent1,[])
    }
    Add(ListBox,2122520,637,140)
    {
    Left=10
    Top=10
    Width=360
    Height=235
    }
    Add(For,8211032,294,147)
    {
    End=99
    link(onEvent,7129927:doAdd,[(543,153)(543,139)])
    link(onStop,6523714:doRepeat,[])
    AddHint(2,-36,27,13,End)
    }
    Add(Hub,11152764,546,161)
    {
    link(onEvent1,7129927:doGetString,[])
    link(onEvent2,7129927:doDelete,[(571,174)(571,153)])
    }
    Add(Hub,6051152,252,140)
    {
    link(onEvent1,77841:doRandomize,[(438,146)(438,174)])
    link(onEvent2,8211032:doFor,[])
    }
    Add(Repeat,6523714,357,154)
    {
    Type=2
    Op2=Integer(0)
    link(onRepeat,2182461:doEvent1,[])
    link(Op1,5138793:Var1,[(363,138)])
    }
    Add(Math,9314667,448,182)
    {
    OpType=1
    Op2=1
    link(onResult,77841:doMax,[])
    link(Op1,5138793:Var2,[])
    }
    Add(Hub,2182461,406,154)
    {
    link(onEvent1,9314667:doOperation,[(431,160)(431,188)])
    link(onEvent2,77841:doRandom,[])
    }
    Add(GetDataEx,5138793,448,133)
    {
    Angle=1
    link(Data,7129927:Count,[(538,138)(538,187)(594,187)])
    }

       Пример использования компонента Random для генерации не повторяющейся последовательности случайных чисел от 0 до 9
    Иногда такую задачу называют "перемешивание колоды карт". Пример статистически корректен
    
    Add(MainForm,11182862,245,119)
    
    {
    Left=20
    Top=105
    Width=154
    Height=251
    Caption="Пример использования Random"
    link(onCreate,5447273:doRandomize,[(349,139)(349,174)])
    }
    Add(Random,5447273,420,161)
    {
    Max=9
    Point(doMin)
    link(onRandom,14407297:doSwap,[])
    }
    Add(StrList,14407297,469,140)
    {
    Strings=#1:0|1:1|1:2|1:3|1:4|1:5|1:6|1:7|1:8|1:9|
    Point(doSwap)
    Point(Idx1)
    link(Idx1,6998305osition,[(489,128)(380,128)(380,219)(314,219)])
    }
    Add(For,6998305,308,175)
    {
    End=8
    link(onEvent,4478720:doEvent1,[])
    link(onStop,13491746:doData,[(351,188)(351,202)])
    }
    Add(Hub,4478720,364,175)
    {
    link(onEvent1,5447273:doMin,[])
    link(onEvent2,5447273:doRandom,[(407,188)(407,167)])
    }
    Add(Button,12351317,245,175)
    {
    Left=10
    Top=10
    link(onClick,6998305:doFor,[])
    }
    Add(Memo,5323340,518,182)
    {
    Left=10
    Top=40
    Width=110
    Height=160
    Point(doText)
    }
    Add(DoData,13491746,469,196)
    {
    link(onEventData,5323340:doText,[])
    link(Data,14407297:Text,[])
    }

       В примере ниже показано использование метода doRandSeed для генерации на 100% воспроизводимой последовательности байтов, которые определяют так называемый ключ шифрования. И который получается довольно длинным Это симметричный алгоритм: каждый байт шифруемого файла преобразовывается по симметричной операции XOR с соответствующим байтом псевдослучайной последовательности. Поэтому повторная шифровка с тем же «паролем» - расшифровывает файл. А «паролем» является начальное значение RandSeed, вводимое в шестнадцатеричном виде

    
    Add(MainForm,828416,154,203)
    
    {
    Left=20
    Top=105
    Width=227
    Height=138
    Caption="Crypt"
    link(onCreate,1056800:doWork3,[(200,223)])
    }
    Add(Button,10540971,154,56)
    {
    Left=35
    Top=15
    Width=65
    Caption="Load"
    link(onClick,13050148:doExecute,[])
    }
    Add(ODialog,13050148,217,56)
    {
    link(onExecute,7538199:doEvent1,[])
    }
    Add(FileStream,10191927,329,63)
    {
    link(onLoad,336576:doCopy,[])
    }
    Add(Hub,7538199,273,56)
    {
    OutCount=3
    link(onEvent1,7855367:doText,[])
    link(onEvent2,10191927:doOpen,[])
    link(onEvent3,10191927:doClose,[])
    }
    Add(MemoryStream,336576,385,63)
    {
    Point(doPosition)
    }
    Add(DataToFile,14399683,490,140)
    {
    link(Stream,15022743:Var2,[])
    }
    Add(For,15345908,385,217)
    {
    IncludeEnd=1
    link(onEvent,14949712:doRandom,[])
    link(onStop,13044440:doData,[(424,230)(424,160)])
    link(End,336576:Size,[])
    }
    Add(Random,14949712,441,217)
    {
    Max=255
    link(onRandom,1152278:doOperation,[])
    }
    Add(GetDataEx,14129763,539,119)
    {
    Angle=3
    link(Data,15022743:Var3,[])
    }
    Add(Math,1152278,490,217)
    {
    OpType=6
    ResultType=0
    link(onResult,7213208:doEvent1,[])
    link(Op1,14399683ata,[])
    }
    Add(GetDataEx,15022743,490,119)
    {
    Angle=3
    link(Data,336576:Stream,[(391,124)])
    }
    Add(DataToFile,16039837,644,224)
    {
    Point(doPosition)
    link(Stream,14129763:Var3,[(650,124)])
    }
    Add(Button,12047601,217,203)
    {
    Left=120
    Top=15
    Width=65
    Caption="Crypt"
    Data=Integer(0)
    link(onClick,5435442:doEvent1,[])
    }
    Add(Edit,598918,329,154)
    {
    Left=120
    Top=40
    Width=65
    Font=[Courier New,8,0,0,204]
    Text="DA03DE1D"
    DataType=3
    }
    Add(Hub,5435442,280,203)
    {
    OutCount=3
    link(onEvent1,336576:doPosition,[(375,209)(375,83)])
    link(onEvent2,5591650:doData,[(305,216)(305,237)])
    link(onEvent3,15345908:doFor,[])
    }
    Add(DoData,5591650,329,231)
    {
    link(onEventData,14949712:doRandSeed,[])
    link(Data,598918:Text,[])
    }
    Add(Button,13466488,154,147)
    {
    Left=35
    Top=40
    Width=65
    Caption="Randomize"
    link(onClick,1056800:doWork2,[])
    }
    Add(Hub,7212954,217,147)
    {
    link(onEvent1,16611715:doRandomize,[(242,153)(242,118)])
    link(onEvent2,16147120:doConvert,[])
    }
    Add(Convertor,16147120,280,154)
    {
    Mode=6
    Digits=8
    link(onResult,598918:doText,[])
    link(Data,16611715:RandSeed,[])
    }
    Add(DoData,14225644,588,217)
    {
    link(onEventData,16039837:doPosition,[(627,223)(627,244)])
    link(Data,15345908osition,[(594,208)(531,208)(531,257)(391,257)])
    }
    Add(HubEx,1056800,196,147)
    {
    link(onEvent,7212954:doEvent1,[])
    }
    Add(FileStream,14658612,588,140)
    {
    Mode=1
    AutoCopy=0
    Point(doCopyFromStream)
    link(FileName,7855367:Text,[])
    }
    Add(Random,16611715,273,105)
    {
    Max=255
    }
    Add(DoData,13044440,539,154)
    {
    link(onEventData,14658612:doCopyFromStream,[])
    link(Data,14129763:Var2,[])
    }
    Add(Edit,7855367,588,56)
    {
    Top=88
    Width=219
    Height=25
    Align=4
    Font=[MS Sans Serif,10,0,0,1]
    Ctl3D=1
    Text="nul"
    }
    Add(Hub,7213208,546,217)
    {
    link(onEvent1,14225644:doData,[])
    link(onEvent2,16039837:doPut,[])
    }
    Замечания
       Значение свойства RandSeed является ГЛОБАЛЬНЫМ. Т.е., если в схеме есть несколько элементов, то чтение этого свойства с любого из них даст одинаковые результаты. А, следовательно, работа нескольких элементов не является полностью независимой. Результат следующей генерации случайного числа зависит от того, был (или нет) вызван перед этим аналогичный метод в другом элементе.
       В случае Mode=Real значение случайного числа =Max не происходит никогда. А значение =Min может произойти, хотя вероятность этого довольно мала (~2.3e-10)

       Метод doRandomize, по факту, всего лишь прибавляет к свойству RandSeed системное время в милисекундах. С последующим "размешиванием" путем холостой генерации случайного числа. На практике, случайными можно считать не более восьми бит, при этом мероприятии. Следовательно, если существует желание сделать свою последовательность псевдослучайных чисел "истинно непредсказуемой" - необходимо вызывать doRandomize не менее 4-х раз для качества Simple (например, в примере "шифрование").
       И, соответственно - не менее 16 раз для Xorshift128 (в этом случае, вышеприведенный пример "шифрования" следует изменить для уже текстового представления свойства RandSeed).

    Обновление элемента: [svn]Random.pas[/svn]
    BB-code статьи для вставки
    Всего комментариев: 0
    (комментарии к статье еще не добавлены)
    Комментарий
    ...