Luxophia

Форк
0
/
LUX.Random.LCG.pas 
313 строк · 14.7 Кб
1
unit LUX.Random.LCG;
2

3
interface //#################################################################### ■
4

5
uses LUX, LUX.D3, LUX.D4,
6
     LUX.Random;
7

8
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
9

10
     //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
11

12
     //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
13

14
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandomLCG<_TSeed_>
15

16
     IRandomLCG<_TSeed_:record> = interface( IRandom<_TSeed_> )
17
     ['{CB661983-1A3A-4FC1-82AF-988943DF8256}']
18
     {protected}
19
     {public}
20
     end;
21

22
     //-------------------------------------------------------------------------
23

24
     TRandomLCG<_TSeed_:record> = class( TRandom<_TSeed_>, IRandomLCG<_TSeed_> )
25
     private
26
     protected
27
     public
28
     end;
29

30
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom32LCG32
31

32
     TRandom32LCG32 = class( TRandomLCG<Int32u> )
33
     private
34
     protected
35
       ///// メソッド
36
       procedure CalcNextSeed; override;
37
       function CalcRandInt32u :Int32u; override;
38
     public
39
       constructor CreateFromRand( const Random_:IRandom ); overload; override;
40
     end;
41

42
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom48LCG48
43

44
     TRandom48LCG48 = class( TRandomLCG<Int64u> )
45
     private
46
     protected
47
       ///// メソッド
48
       procedure CalcNextSeed; override;
49
       function CalcRandInt32u :Int32u; override;
50
       function CalcRandInt48u :Int64u;
51
       function CalcRandInt64u :Int64u; override;
52
     public
53
       constructor CreateFromRand( const Random_:IRandom ); overload; override;
54
       constructor Create( const Seed_:Int64u ); overload; override;
55
       ///// メソッド
56
       function DrawRandInt48u :Int64u;
57
     end;
58

59
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom64LCG64
60

61
     TRandom64LCG64 = class( TRandomLCG<Int64u> )
62
     private
63
     protected
64
       ///// メソッド
65
       procedure CalcNextSeed; override;
66
       function CalcRandInt32u :Int32u; override;
67
       function CalcRandInt64u :Int64u; override;
68
     public
69
       constructor CreateFromRand( const Random_:IRandom ); overload; override;
70
     end;
71

72
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
73

74
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
75

76
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
77

78
implementation //############################################################### ■
79

80
uses System.SysUtils, System.SyncObjs;
81

82
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
83

84
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
85

86
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandomLCG<_TSeed_>
87

88
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
89

90
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
91

92
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
93

94
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom32LCG32
95

96
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
97

98
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
99

100
/////////////////////////////////////////////////////////////////////// メソッド
101

102
procedure TRandom32LCG32.CalcNextSeed;
103
const
104
     ///// Numerical Recipes
105
     A :Int32u = 1664525;
106
     C :Int32u = 1013904223;
107
     {
108
     ///// Borland C/C++
109
     A :Int32u = 22695477;
110
     C :Int32u = 1;
111
     ///// Borland Delphi, Virtual Pascal, Turbo Pascal
112
     A :Int32u = 134775813;
113
     C :Int32u = 	1;
114
     ///// Microsoft Visual/Quick C/C++
115
     A :Int32u = 214013;
116
     C :Int32u = 2531011;
117
     ///// VMS's MTH$RANDOM, old versions of glibc
118
     A :Int32u = 69069;
119
     C :Int32u = 1;
120
     ///// cc65
121
     A :Int32u = 16843009;
122
     C :Int32u = 826366247;
123
     }
124
begin
125
     //          48              32              16               0
126
     //           |               |               |               |
127
     // A   =     |                           110010110011000001101 = 1664525
128
     // C   =     |               |  111100011011101111001101011111 = 1013904223
129
     // M   =                     100000000000000000000000000000000 = 4294967296 = 2^32
130
     // M-1 =     |               |11111111111111111111111111111111 = 4294967295 = 2^32-1
131
     //           |               |               |               |
132

133
     //          48              32              16               0
134
     //           |               |               |               |
135
     // S   =     |               |11111111111111111111111111111111 = 4294967295 = 2^32-1
136
     // * A = 11001011001100000110011111111111001101001100111110011 = 7149080436709875
137
     // + C = 11001011001100000110100111100010101011000110101010010 = 7149081450614098
138
     // % M =     |               |00111100010101011000110101010010 = 1012239698
139
     //           |               |               |               |
140

141
     //          48              32              16               0
142
     //           |               |               |               |
143
     // S   =     |               |11111111111111111111111111111111 = 4294967295 = 2^32-1
144
     // * A = 11001011001100000110011111111111001101001100111110011 = 7149080436709875
145
     // % M =     |               |11111111111001101001100111110011 = 4293302771
146
     // + C =     |               100111100010101011000110101010010 = 5307206994
147
     // % M =     |               |00111100010101011000110101010010 = 1012239698
148
     //           |               |               |               |
149

150
     _Seed := A * _Seed + C;
151
end;
152

153
function TRandom32LCG32.CalcRandInt32u :Int32u;
154
begin
155
     Result := _Seed;
156
end;
157

158
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
159

160
constructor TRandom32LCG32.CreateFromRand( const Random_:IRandom );
161
begin
162
     Create( Random_.DrawRandInt32u );
163
end;
164

165
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom48LCG48
166

167
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
168

169
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
170

171
/////////////////////////////////////////////////////////////////////// メソッド
172

173
procedure TRandom48LCG48.CalcNextSeed;
174
const
175
     A  :Int64u = 25214903917;
176
     C  :Int64u = 11;
177
     M1 :Int64u = 281474976710655{= 2^48-1 };
178
begin
179
     //        96              64              48              32              16               0
180
     //         |               |               |               |               |               |
181
     // A   =   |               |               |             10111011110111011001110011001101101 = 25214903917
182
     // C   =   |               |               |               |               |            1011 = 11
183
     // M   =   |               |               1000000000000000000000000000000000000000000000000 = 281474976710656 = 2^48
184
     // M-1 =   |               |               |111111111111111111111111111111111111111111111111 = 281474976710655 = 2^48-1
185
     //         |               |               |               |               |               |
186

187
     //        96              64              48              32              16               0
188
     //         |               |               |               |               |               |
189
     // S   =   |               |               |111111111111111111111111111111111111111111111111 = 281474976710655 = 2^48-1
190
     // * A = 10111011110111011001110011001101100111111111111101000100001000100110001100110010011 = 7097364492798978535135635
191
     // + C = 10111011110111011001110011001101100111111111111101000100001000100110001100110011110 = 7097364492798978535135646
192
     // % M =   |               |               |111111111111101000100001000100110001100110011110 = 281449761806750
193
     //         |               |               |               |               |               |
194

195
     //        96              64              48              32              16               0
196
     //         |               |               |               |               |               |
197
     // S   =   |               |               |111111111111111111111111111111111111111111111111 = 281474976710655 = 2^48-1
198
     // * A = 10111011110111011001110011001101100111111111111101000100001000100110001100110010011 = 7097364492798978535135635
199
     // % M =   |               |               |111111111111101000100001000100110001100110010011 = 281449761806739
200
     // + C =   |               |               |111111111111101000100001000100110001100110011110 = 281449761806750
201
     // % M =   |               |               |111111111111101000100001000100110001100110011110 = 281449761806750
202
     //         |               |               |               |               |               |
203

204
     _Seed := ( A * _Seed + C ) and M1;
205
end;
206

207
function TRandom48LCG48.CalcRandInt32u :Int32u;
208
begin
209
     Result := CalcRandInt48u shr 16;
210
end;
211

212
function TRandom48LCG48.CalcRandInt48u :Int64u;
213
begin
214
     Result := _Seed;
215
end;
216

217
function TRandom48LCG48.CalcRandInt64u :Int64u;
218
begin
219
     Result := CalcRandInt48u shr 16;  CalcNextSeed;
220

221
     Result := ( Result shl 32 ) or ( CalcRandInt48u shr 16 );
222
end;
223

224
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
225

226
constructor TRandom48LCG48.CreateFromRand( const Random_:IRandom );
227
begin
228
     Create( Random_.DrawRandInt64u );
229
end;
230

231
constructor TRandom48LCG48.Create( const Seed_:Int64u );
232
begin
233
     inherited Create( Seed_ and $FFFFFFFFFFFF{= 2^48-1 } );
234
end;
235

236
/////////////////////////////////////////////////////////////////////// メソッド
237

238
function TRandom48LCG48.DrawRandInt48u :Int64u;
239
begin
240
     _SeedCS.Enter;
241

242
       Result := CalcRandInt48u;  CalcNextSeed;
243

244
     _SeedCS.Leave;
245
end;
246

247
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom64LCG64
248

249
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
250

251
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
252

253
/////////////////////////////////////////////////////////////////////// メソッド
254

255
procedure TRandom64LCG64.CalcNextSeed;
256
const
257
     A :Int64u = 6364136223846793005;
258
     C :Int64u = 1442695040888963407;
259
begin
260
     //                   128             112              96              64              48              32              16               0
261
     //                     |               |               |               |               |               |               |               |
262
     // A   =               |               |               |               | 101100001010001111101000010110101001100100101010111111100101101 = 6364136223846793005
263
     // C   =               |               |               |               |   1010000000101011110110111111011110111011001111000000101001111 = 1442695040888963407
264
     // M   =               |               |               |               10000000000000000000000000000000000000000000000000000000000000000 = 18446744073709551616 = 2^64
265
     // M-1 =               |               |               |               |1111111111111111111111111111111111111111111111111111111111111111 = 18446744073709551615 = 2^64-1
266
     //                     |               |               |               |               |               |               |               |
267

268
     //                   128             112              96              64              48              32              16               0
269
     //                     |               |               |               |               |               |               |               |
270
     // S   =               |               |               |               |1111111111111111111111111111111111111111111111111111111111111111 = 18446744073709551615 = 2^64-1
271
     // * A = 1011000010100011111010000101101010011001001010101111111001011001010011110101110000010111101001010110011011010101000000011010011 = 117397592171526113260752102854268453075
272
     // + C = 1011000010100011111010000101101010011001001010101111111001011001011101110110011100001110101000110101010110100100000001000100010 = 117397592171526113262194797895157416482
273
     // % M =               |               |               |               |1011101110110011100001110101000110101010110100100000001000100010 = 13525302890751722018
274
     //                     |               |               |               |               |               |               |               |
275

276
     //                   128             112              96              64              48              32              16               0
277
     //                     |               |               |               |               |               |               |               |
278
     // S   =               |               |               |               |1111111111111111111111111111111111111111111111111111111111111111 = 18446744073709551615 = 2^64-1
279
     // * A = 1011000010100011111010000101101010011001001010101111111001011001010011110101110000010111101001010110011011010101000000011010011 = 117397592171526113260752102854268453075
280
     // % M =               |               |               |               |1010011110101110000010111101001010110011011010101000000011010011 = 12082607849862758611
281
     // + C =               |               |               |               |1011101110110011100001110101000110101010110100100000001000100010 = 13525302890751722018
282
     // % M =               |               |               |               |1011101110110011100001110101000110101010110100100000001000100010 = 13525302890751722018
283
     //                     |               |               |               |               |               |               |               |
284

285
     _Seed := A * _Seed + C;
286
end;
287

288
function TRandom64LCG64.CalcRandInt32u :Int32u;
289
begin
290
     Result := DrawRandInt64u shr 32;
291
end;
292

293
function TRandom64LCG64.CalcRandInt64u :Int64u;
294
begin
295
     Result := _Seed;
296
end;
297

298
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
299

300
constructor TRandom64LCG64.CreateFromRand( const Random_:IRandom );
301
begin
302
     Create( Random_.DrawRandInt64u );
303
end;
304

305
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
306

307
//############################################################################## □
308

309
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
310

311
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
312

313
end. //######################################################################### ■

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.