5 // Bob Smith (bob@thestuff.net)
6 // Ben Maurer (bmaurer@users.sourceforge.net)
8 // (C) 2001 Bob Smith. http://www.thestuff.net
13 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
40 const int MBIG
= int.MaxValue
;
41 const int MSEED
= 161803398;
45 int [] SeedArray
= new int [56];
48 : this (Environment
.TickCount
)
52 public Random (int Seed
)
57 // Numerical Recipes in C online @ http://www.library.cornell.edu/nr/bookcpdf/c7-1.pdf
58 mj
= MSEED
- Math
.Abs (Seed
);
61 for (int i
= 1; i
< 55; i
++) { // [1, 55] is special (Knuth)
69 for (int k
= 1; k
< 5; k
++) {
70 for (int i
= 1; i
< 56; i
++) {
71 SeedArray
[i
] -= SeedArray
[1 + (i
+ 30) % 55];
72 if (SeedArray
[i
] < 0)
73 SeedArray
[i
] += MBIG
;
80 protected virtual double Sample ()
84 if (++inext
>= 56) inext
= 1;
85 if (++inextp
>= 56) inextp
= 1;
87 retVal
= SeedArray
[inext
] - SeedArray
[inextp
];
92 SeedArray
[inext
] = retVal
;
94 return retVal
* (1.0 / MBIG
);
97 public virtual int Next ()
99 return (int)(Sample () * int.MaxValue
);
102 public virtual int Next (int maxValue
)
105 throw new ArgumentOutOfRangeException(Locale
.GetText (
106 "Max value is less then min value."));
108 return (int)(Sample () * maxValue
);
111 public virtual int Next (int minValue
, int maxValue
)
113 if (minValue
> maxValue
)
114 throw new ArgumentOutOfRangeException (Locale
.GetText (
115 "Min value is greater then max value."));
117 uint diff
= (uint)(maxValue
- minValue
);
121 int result
= (int)(Sample () * diff
+ minValue
);
122 return ((result
!= maxValue
) ? result
: (result
- 1));
125 public virtual void NextBytes (byte [] buffer
)
128 throw new ArgumentNullException ("buffer");
130 for (int i
= 0; i
< buffer
.Length
; i
++) {
131 buffer
[i
] = (byte)(Sample () * (byte.MaxValue
+ 1));
135 public virtual double NextDouble ()
137 return this.Sample ();