3
interface //#################################################################### ■
5
uses LUX, LUX.D3, LUX.D4,
8
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
10
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
12
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
14
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandomLCG<_TSeed_>
16
IRandomLCG<_TSeed_:record> = interface( IRandom<_TSeed_> )
17
['{CB661983-1A3A-4FC1-82AF-988943DF8256}']
22
//-------------------------------------------------------------------------
24
TRandomLCG<_TSeed_:record> = class( TRandom<_TSeed_>, IRandomLCG<_TSeed_> )
30
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom32LCG32
32
TRandom32LCG32 = class( TRandomLCG<Int32u> )
36
procedure CalcNextSeed; override;
37
function CalcRandInt32u :Int32u; override;
39
constructor CreateFromRand( const Random_:IRandom ); overload; override;
42
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom48LCG48
44
TRandom48LCG48 = class( TRandomLCG<Int64u> )
48
procedure CalcNextSeed; override;
49
function CalcRandInt32u :Int32u; override;
50
function CalcRandInt48u :Int64u;
51
function CalcRandInt64u :Int64u; override;
53
constructor CreateFromRand( const Random_:IRandom ); overload; override;
54
constructor Create( const Seed_:Int64u ); overload; override;
56
function DrawRandInt48u :Int64u;
59
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom64LCG64
61
TRandom64LCG64 = class( TRandomLCG<Int64u> )
65
procedure CalcNextSeed; override;
66
function CalcRandInt32u :Int32u; override;
67
function CalcRandInt64u :Int64u; override;
69
constructor CreateFromRand( const Random_:IRandom ); overload; override;
72
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
74
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
76
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
78
implementation //############################################################### ■
80
uses System.SysUtils, System.SyncObjs;
82
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
84
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
86
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandomLCG<_TSeed_>
88
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
90
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
92
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
94
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom32LCG32
96
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
98
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
100
/////////////////////////////////////////////////////////////////////// メソッド
102
procedure TRandom32LCG32.CalcNextSeed;
104
///// Numerical Recipes
106
C :Int32u = 1013904223;
109
A :Int32u = 22695477;
111
///// Borland Delphi, Virtual Pascal, Turbo Pascal
112
A :Int32u = 134775813;
114
///// Microsoft Visual/Quick C/C++
117
///// VMS's MTH$RANDOM, old versions of glibc
121
A :Int32u = 16843009;
122
C :Int32u = 826366247;
127
// A = | 110010110011000001101 = 1664525
128
// C = | | 111100011011101111001101011111 = 1013904223
129
// M = 100000000000000000000000000000000 = 4294967296 = 2^32
130
// M-1 = | |11111111111111111111111111111111 = 4294967295 = 2^32-1
135
// S = | |11111111111111111111111111111111 = 4294967295 = 2^32-1
136
// * A = 11001011001100000110011111111111001101001100111110011 = 7149080436709875
137
// + C = 11001011001100000110100111100010101011000110101010010 = 7149081450614098
138
// % M = | |00111100010101011000110101010010 = 1012239698
143
// S = | |11111111111111111111111111111111 = 4294967295 = 2^32-1
144
// * A = 11001011001100000110011111111111001101001100111110011 = 7149080436709875
145
// % M = | |11111111111001101001100111110011 = 4293302771
146
// + C = | 100111100010101011000110101010010 = 5307206994
147
// % M = | |00111100010101011000110101010010 = 1012239698
150
_Seed := A * _Seed + C;
153
function TRandom32LCG32.CalcRandInt32u :Int32u;
158
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
160
constructor TRandom32LCG32.CreateFromRand( const Random_:IRandom );
162
Create( Random_.DrawRandInt32u );
165
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom48LCG48
167
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
169
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
171
/////////////////////////////////////////////////////////////////////// メソッド
173
procedure TRandom48LCG48.CalcNextSeed;
175
A :Int64u = 25214903917;
177
M1 :Int64u = 281474976710655{= 2^48-1 };
181
// A = | | | 10111011110111011001110011001101101 = 25214903917
182
// C = | | | | | 1011 = 11
183
// M = | | 1000000000000000000000000000000000000000000000000 = 281474976710656 = 2^48
184
// M-1 = | | |111111111111111111111111111111111111111111111111 = 281474976710655 = 2^48-1
189
// S = | | |111111111111111111111111111111111111111111111111 = 281474976710655 = 2^48-1
190
// * A = 10111011110111011001110011001101100111111111111101000100001000100110001100110010011 = 7097364492798978535135635
191
// + C = 10111011110111011001110011001101100111111111111101000100001000100110001100110011110 = 7097364492798978535135646
192
// % M = | | |111111111111101000100001000100110001100110011110 = 281449761806750
197
// S = | | |111111111111111111111111111111111111111111111111 = 281474976710655 = 2^48-1
198
// * A = 10111011110111011001110011001101100111111111111101000100001000100110001100110010011 = 7097364492798978535135635
199
// % M = | | |111111111111101000100001000100110001100110010011 = 281449761806739
200
// + C = | | |111111111111101000100001000100110001100110011110 = 281449761806750
201
// % M = | | |111111111111101000100001000100110001100110011110 = 281449761806750
204
_Seed := ( A * _Seed + C ) and M1;
207
function TRandom48LCG48.CalcRandInt32u :Int32u;
209
Result := CalcRandInt48u shr 16;
212
function TRandom48LCG48.CalcRandInt48u :Int64u;
217
function TRandom48LCG48.CalcRandInt64u :Int64u;
219
Result := CalcRandInt48u shr 16; CalcNextSeed;
221
Result := ( Result shl 32 ) or ( CalcRandInt48u shr 16 );
224
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
226
constructor TRandom48LCG48.CreateFromRand( const Random_:IRandom );
228
Create( Random_.DrawRandInt64u );
231
constructor TRandom48LCG48.Create( const Seed_:Int64u );
233
inherited Create( Seed_ and $FFFFFFFFFFFF{= 2^48-1 } );
236
/////////////////////////////////////////////////////////////////////// メソッド
238
function TRandom48LCG48.DrawRandInt48u :Int64u;
242
Result := CalcRandInt48u; CalcNextSeed;
247
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRandom64LCG64
249
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
251
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
253
/////////////////////////////////////////////////////////////////////// メソッド
255
procedure TRandom64LCG64.CalcNextSeed;
257
A :Int64u = 6364136223846793005;
258
C :Int64u = 1442695040888963407;
260
// 128 112 96 64 48 32 16 0
262
// A = | | | | 101100001010001111101000010110101001100100101010111111100101101 = 6364136223846793005
263
// C = | | | | 1010000000101011110110111111011110111011001111000000101001111 = 1442695040888963407
264
// M = | | | 10000000000000000000000000000000000000000000000000000000000000000 = 18446744073709551616 = 2^64
265
// M-1 = | | | |1111111111111111111111111111111111111111111111111111111111111111 = 18446744073709551615 = 2^64-1
268
// 128 112 96 64 48 32 16 0
270
// S = | | | |1111111111111111111111111111111111111111111111111111111111111111 = 18446744073709551615 = 2^64-1
271
// * A = 1011000010100011111010000101101010011001001010101111111001011001010011110101110000010111101001010110011011010101000000011010011 = 117397592171526113260752102854268453075
272
// + C = 1011000010100011111010000101101010011001001010101111111001011001011101110110011100001110101000110101010110100100000001000100010 = 117397592171526113262194797895157416482
273
// % M = | | | |1011101110110011100001110101000110101010110100100000001000100010 = 13525302890751722018
276
// 128 112 96 64 48 32 16 0
278
// S = | | | |1111111111111111111111111111111111111111111111111111111111111111 = 18446744073709551615 = 2^64-1
279
// * A = 1011000010100011111010000101101010011001001010101111111001011001010011110101110000010111101001010110011011010101000000011010011 = 117397592171526113260752102854268453075
280
// % M = | | | |1010011110101110000010111101001010110011011010101000000011010011 = 12082607849862758611
281
// + C = | | | |1011101110110011100001110101000110101010110100100000001000100010 = 13525302890751722018
282
// % M = | | | |1011101110110011100001110101000110101010110100100000001000100010 = 13525302890751722018
285
_Seed := A * _Seed + C;
288
function TRandom64LCG64.CalcRandInt32u :Int32u;
290
Result := DrawRandInt64u shr 32;
293
function TRandom64LCG64.CalcRandInt64u :Int64u;
298
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
300
constructor TRandom64LCG64.CreateFromRand( const Random_:IRandom );
302
Create( Random_.DrawRandInt64u );
305
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
307
//############################################################################## □
309
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
311
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
313
end. //######################################################################### ■