@@ -13,7 +13,8 @@ namespace RandomDataGenerator.Generators
1313 internal class RandomValueGenerator
1414 {
1515 private const double Tolerance = double . Epsilon ;
16- private Random _rnf = new ( ) ;
16+ static Random _rnf = new ( ) ;
17+ static readonly object RandomLock = new object ( ) ;
1718 private double _storedUniformDeviate ;
1819 private bool _storedUniformDeviateIsGood ;
1920
@@ -27,7 +28,10 @@ public RandomValueGenerator(int seed)
2728
2829 public void Reset ( int seed )
2930 {
30- _rnf = new Random ( seed ) ;
31+ lock ( RandomLock )
32+ {
33+ _rnf = new Random ( seed ) ;
34+ }
3135 }
3236 #endregion
3337
@@ -38,23 +42,32 @@ public void Reset(int seed)
3842 /// </summary>
3943 public double Next ( )
4044 {
41- return _rnf . NextDouble ( ) ;
45+ lock ( RandomLock )
46+ {
47+ return _rnf . NextDouble ( ) ;
48+ }
4249 }
4350
4451 /// <summary>
4552 /// Returns true or false randomly.
4653 /// </summary>
4754 public bool NextBoolean ( )
4855 {
49- return _rnf . Next ( 0 , 2 ) != 0 ;
56+ lock ( RandomLock )
57+ {
58+ return _rnf . Next ( 0 , 2 ) != 0 ;
59+ }
5060 }
5161
5262 /// <summary>
5363 /// Returns double in the range [0, 1)
5464 /// </summary>
5565 public double NextDouble ( )
5666 {
57- return _rnf . NextDouble ( ) ;
67+ lock ( RandomLock )
68+ {
69+ return _rnf . NextDouble ( ) ;
70+ }
5871 }
5972
6073 /// <summary>
@@ -68,7 +81,10 @@ public byte[] NextBytes(int min, int max)
6881 int arrayLength = Next ( min , max ) ;
6982
7083 byte [ ] bytes = new byte [ arrayLength ] ;
71- _rnf . NextBytes ( bytes ) ;
84+ lock ( RandomLock )
85+ {
86+ _rnf . NextBytes ( bytes ) ;
87+ }
7288
7389 return bytes ;
7490 }
@@ -140,8 +156,11 @@ public byte Next(byte min, byte max)
140156 throw new ArgumentException ( "Max must be greater than min." ) ;
141157 }
142158
143- double rn = ( max * 1.0 - min * 1.0 ) * _rnf . NextDouble ( ) + min * 1.0 ;
144- return Convert . ToByte ( rn ) ;
159+ lock ( RandomLock )
160+ {
161+ double rn = ( max * 1.0 - min * 1.0 ) * _rnf . NextDouble ( ) + min * 1.0 ;
162+ return Convert . ToByte ( rn ) ;
163+ }
145164 }
146165
147166 /// <summary>
@@ -154,16 +173,22 @@ public short Next(short min, short max)
154173 throw new ArgumentException ( "Max must be greater than min." ) ;
155174 }
156175
157- double rn = ( max * 1.0 - min * 1.0 ) * _rnf . NextDouble ( ) + min * 1.0 ;
158- return Convert . ToInt16 ( rn ) ;
176+ lock ( RandomLock )
177+ {
178+ double rn = ( max * 1.0 - min * 1.0 ) * _rnf . NextDouble ( ) + min * 1.0 ;
179+ return Convert . ToInt16 ( rn ) ;
180+ }
159181 }
160182
161183 /// <summary>
162184 /// Returns Int32 in the range [min, max)
163185 /// </summary>
164186 public int Next ( int min , int max )
165187 {
166- return _rnf . Next ( min , max ) ;
188+ lock ( RandomLock )
189+ {
190+ return _rnf . Next ( min , max ) ;
191+ }
167192 }
168193
169194 /// <summary>
@@ -176,8 +201,11 @@ public long Next(long min, long max)
176201 throw new ArgumentException ( "Max must be greater than min." ) ;
177202 }
178203
179- double rn = ( max * 1.0 - min * 1.0 ) * _rnf . NextDouble ( ) + min * 1.0 ;
180- return Convert . ToInt64 ( rn ) ;
204+ lock ( RandomLock )
205+ {
206+ double rn = ( max * 1.0 - min * 1.0 ) * _rnf . NextDouble ( ) + min * 1.0 ;
207+ return Convert . ToInt64 ( rn ) ;
208+ }
181209 }
182210
183211 /// <summary>
@@ -190,8 +218,11 @@ public float Next(float min, float max)
190218 throw new ArgumentException ( "Max must be greater than min." ) ;
191219 }
192220
193- double rn = ( max * 1.0 - min * 1.0 ) * _rnf . NextDouble ( ) + min * 1.0 ;
194- return Convert . ToSingle ( rn ) ;
221+ lock ( RandomLock )
222+ {
223+ double rn = ( max * 1.0 - min * 1.0 ) * _rnf . NextDouble ( ) + min * 1.0 ;
224+ return Convert . ToSingle ( rn ) ;
225+ }
195226 }
196227
197228 /// <summary>
@@ -204,8 +235,11 @@ public double Next(double min, double max)
204235 throw new ArgumentException ( "Max must be greater than min." ) ;
205236 }
206237
207- double rn = ( max - min ) * _rnf . NextDouble ( ) + min ;
208- return rn ;
238+ lock ( RandomLock )
239+ {
240+ double rn = ( max - min ) * _rnf . NextDouble ( ) + min ;
241+ return rn ;
242+ }
209243 }
210244
211245 /// <summary>
@@ -220,10 +254,13 @@ public DateTime Next(DateTime min, DateTime max)
220254
221255 long minTicks = min . Ticks ;
222256 long maxTicks = max . Ticks ;
223- double rn = ( Convert . ToDouble ( maxTicks )
224- - Convert . ToDouble ( minTicks ) ) * _rnf . NextDouble ( )
225- + Convert . ToDouble ( minTicks ) ;
226- return new DateTime ( Convert . ToInt64 ( rn ) ) ;
257+ lock ( RandomLock )
258+ {
259+ double rn = ( Convert . ToDouble ( maxTicks )
260+ - Convert . ToDouble ( minTicks ) ) * _rnf . NextDouble ( )
261+ + Convert . ToDouble ( minTicks ) ;
262+ return new DateTime ( Convert . ToInt64 ( rn ) ) ;
263+ }
227264 }
228265
229266 /// <summary>
@@ -238,10 +275,13 @@ public TimeSpan Next(TimeSpan min, TimeSpan max)
238275
239276 long minTicks = min . Ticks ;
240277 long maxTicks = max . Ticks ;
241- double rn = ( Convert . ToDouble ( maxTicks )
242- - Convert . ToDouble ( minTicks ) ) * _rnf . NextDouble ( )
243- + Convert . ToDouble ( minTicks ) ;
244- return new TimeSpan ( Convert . ToInt64 ( rn ) ) ;
278+ lock ( RandomLock )
279+ {
280+ double rn = ( Convert . ToDouble ( maxTicks )
281+ - Convert . ToDouble ( minTicks ) ) * _rnf . NextDouble ( )
282+ + Convert . ToDouble ( minTicks ) ;
283+ return new TimeSpan ( Convert . ToInt64 ( rn ) ) ;
284+ }
245285 }
246286
247287 /// <summary>
0 commit comments