| Лoгикa | - Random |
Random
Краткое описание
Генератор псевдослучайной числовой последовательности.
Параметры
Методы
События
Свойства
Данные
Примеры
Пример использования компонента 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)])
}
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]
В случае Mode=Real значение случайного числа =Max не происходит никогда. А значение =Min может произойти, хотя вероятность этого довольно мала (~2.3e-10)
Метод doRandomize, по факту, всего лишь прибавляет к свойству RandSeed системное время в милисекундах. С последующим "размешиванием" путем холостой генерации случайного числа. На практике, случайными можно считать не более восьми бит, при этом мероприятии. Следовательно, если существует желание сделать свою последовательность псевдослучайных чисел "истинно непредсказуемой" - необходимо вызывать doRandomize не менее 4-х раз для качества Simple (например, в примере "шифрование").
И, соответственно - не менее 16 раз для Xorshift128 (в этом случае, вышеприведенный пример "шифрования" следует изменить для уже текстового представления свойства RandSeed).
Обновление элемента: [svn]Random.pas[/svn]
BB-code статьи для вставки
Всего комментариев: 0
(комментарии к статье еще не добавлены)