Skip to content

Commit e118c87

Browse files
committed
test: use isolated RandomState in distribution tests for parallel execution
Convert remaining np.random.* tests to use isolated RandomState instances instead of global np.random.seed() to avoid test collisions during parallel execution. Files converted: - np.random.logseries.Test.cs - np.random.multivariate_normal.Test.cs - np.random.noncentral_chisquare.Test.cs - np.random.noncentral_f.Test.cs - np.random.standard_gamma.Test.cs - np.random.standard_t.Test.cs - np.random.triangular.Tests.cs - np.random.vonmises.Test.cs - np.random.wald.Test.cs Changes made: - Replace np.random.seed(n) with var rng = np.random.RandomState(n) - Replace np.random.distribution() calls with rng.distribution() - Exception tests continue to use np.random.distribution() directly (no seeding needed for argument validation tests) - Reproducibility tests use separate rng1/rng2 instances
1 parent 6d99853 commit e118c87

9 files changed

Lines changed: 255 additions & 255 deletions

test/NumSharp.UnitTest/RandomSampling/np.random.logseries.Test.cs

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace NumSharp.UnitTest.RandomSampling
99
{
1010
/// <summary>
11-
/// Tests for np.random.logseries (logarithmic series distribution).
11+
/// Tests for rng.logseries (logarithmic series distribution).
1212
/// Based on NumPy 2.4.2 behavior.
1313
/// </summary>
1414

@@ -19,8 +19,8 @@ public class np_random_logseries_Tests
1919
[Test]
2020
public void Logseries_Scalar_ReturnsNDArray()
2121
{
22-
np.random.seed(42);
23-
var result = np.random.logseries(0.6);
22+
var rng = np.random.RandomState(42);
23+
var result = rng.logseries(0.6);
2424

2525
result.Should().NotBeNull();
2626
result.ndim.Should().Be(0); // Scalar
@@ -30,8 +30,8 @@ public void Logseries_Scalar_ReturnsNDArray()
3030
[Test]
3131
public void Logseries_1D_ReturnsCorrectShape()
3232
{
33-
np.random.seed(42);
34-
var result = np.random.logseries(0.6, 10);
33+
var rng = np.random.RandomState(42);
34+
var result = rng.logseries(0.6, 10);
3535

3636
result.Should().BeShaped(10);
3737
result.dtype.Should().Be(typeof(long));
@@ -40,8 +40,8 @@ public void Logseries_1D_ReturnsCorrectShape()
4040
[Test]
4141
public void Logseries_2D_ReturnsCorrectShape()
4242
{
43-
np.random.seed(42);
44-
var result = np.random.logseries(0.6, new int[] { 2, 3 });
43+
var rng = np.random.RandomState(42);
44+
var result = rng.logseries(0.6, new int[] { 2, 3 });
4545

4646
result.Should().BeShaped(2, 3);
4747
result.dtype.Should().Be(typeof(long));
@@ -50,17 +50,17 @@ public void Logseries_2D_ReturnsCorrectShape()
5050
[Test]
5151
public void Logseries_SizeNull_ReturnsScalar()
5252
{
53-
np.random.seed(42);
54-
var result = np.random.logseries(0.6, (Shape?)null);
53+
var rng = np.random.RandomState(42);
54+
var result = rng.logseries(0.6, (Shape?)null);
5555

5656
result.ndim.Should().Be(0);
5757
}
5858

5959
[Test]
6060
public void Logseries_3DShape()
6161
{
62-
np.random.seed(42);
63-
var result = np.random.logseries(0.5, new Shape(2, 3, 4));
62+
var rng = np.random.RandomState(42);
63+
var result = rng.logseries(0.5, new Shape(2, 3, 4));
6464

6565
result.Should().BeShaped(2, 3, 4);
6666
result.size.Should().Be(24);
@@ -73,8 +73,8 @@ public void Logseries_3DShape()
7373
[Test]
7474
public void Logseries_AllValuesAtLeast1()
7575
{
76-
np.random.seed(42);
77-
var result = np.random.logseries(0.7, 1000);
76+
var rng = np.random.RandomState(42);
77+
var result = rng.logseries(0.7, 1000);
7878
var data = result.ToArray<long>();
7979

8080
foreach (var v in data)
@@ -87,8 +87,8 @@ public void Logseries_AllValuesAtLeast1()
8787
public void Logseries_SmallP_MostlyOnes()
8888
{
8989
// With small p, values should be mostly 1
90-
np.random.seed(42);
91-
var result = np.random.logseries(0.1, 100);
90+
var rng = np.random.RandomState(42);
91+
var result = rng.logseries(0.1, 100);
9292
var data = result.ToArray<long>();
9393

9494
int countOnes = data.Count(v => v == 1);
@@ -100,8 +100,8 @@ public void Logseries_SmallP_MostlyOnes()
100100
public void Logseries_HighP_LargerValues()
101101
{
102102
// With high p close to 1, values should have more variation
103-
np.random.seed(42);
104-
var result = np.random.logseries(0.99, 100);
103+
var rng = np.random.RandomState(42);
104+
var result = rng.logseries(0.99, 100);
105105
var data = result.ToArray<long>();
106106

107107
long maxValue = data.Max();
@@ -113,8 +113,8 @@ public void Logseries_HighP_LargerValues()
113113
public void Logseries_PZero_AllOnes()
114114
{
115115
// When p=0, all values should be 1
116-
np.random.seed(42);
117-
var result = np.random.logseries(0.0, 10);
116+
var rng = np.random.RandomState(42);
117+
var result = rng.logseries(0.0, 10);
118118
var data = result.ToArray<long>();
119119

120120
foreach (var v in data)
@@ -130,8 +130,8 @@ public void Logseries_MeanApproximatesTheoretical()
130130
double p = 0.6;
131131
double theoreticalMean = -p / ((1 - p) * Math.Log(1 - p));
132132

133-
np.random.seed(42);
134-
var result = np.random.logseries(p, 100000);
133+
var rng = np.random.RandomState(42);
134+
var result = rng.logseries(p, 100000);
135135
var data = result.ToArray<long>();
136136

137137
double sampleMean = data.Average();
@@ -174,11 +174,11 @@ public void Logseries_PIsNaN_Throws()
174174
[Test]
175175
public void Logseries_SameSeed_SameResults()
176176
{
177-
np.random.seed(12345);
178-
var result1 = np.random.logseries(0.6, 10);
177+
var rng1 = np.random.RandomState(12345);
178+
var result1 = rng1.logseries(0.6, 10);
179179

180-
np.random.seed(12345);
181-
var result2 = np.random.logseries(0.6, 10);
180+
var rng2 = np.random.RandomState(12345);
181+
var result2 = rng2.logseries(0.6, 10);
182182

183183
var data1 = result1.ToArray<long>();
184184
var data2 = result2.ToArray<long>();
@@ -192,11 +192,11 @@ public void Logseries_SameSeed_SameResults()
192192
[Test]
193193
public void Logseries_DifferentSeeds_DifferentResults()
194194
{
195-
np.random.seed(111);
196-
var result1 = np.random.logseries(0.6, 100);
195+
var rng1 = np.random.RandomState(111);
196+
var result1 = rng1.logseries(0.6, 100);
197197

198-
np.random.seed(222);
199-
var result2 = np.random.logseries(0.6, 100);
198+
var rng2 = np.random.RandomState(222);
199+
var result2 = rng2.logseries(0.6, 100);
200200

201201
var data1 = result1.ToArray<long>();
202202
var data2 = result2.ToArray<long>();
@@ -222,8 +222,8 @@ public void Logseries_DifferentSeeds_DifferentResults()
222222
public void Logseries_VerySmallP()
223223
{
224224
// Edge case: very small p should still produce valid output
225-
np.random.seed(42);
226-
var result = np.random.logseries(1e-10, 10);
225+
var rng = np.random.RandomState(42);
226+
var result = rng.logseries(1e-10, 10);
227227
var data = result.ToArray<long>();
228228

229229
foreach (var v in data)
@@ -236,8 +236,8 @@ public void Logseries_VerySmallP()
236236
public void Logseries_PCloseToOne()
237237
{
238238
// Edge case: p very close to 1 (but less than 1)
239-
np.random.seed(42);
240-
var result = np.random.logseries(0.9999, 10);
239+
var rng = np.random.RandomState(42);
240+
var result = rng.logseries(0.9999, 10);
241241
var data = result.ToArray<long>();
242242

243243
foreach (var v in data)
@@ -251,8 +251,8 @@ public void Logseries_PCloseToOne()
251251
[Test]
252252
public void Logseries_Size1_ReturnsSingleElementArray()
253253
{
254-
np.random.seed(42);
255-
var result = np.random.logseries(0.5, 1);
254+
var rng = np.random.RandomState(42);
255+
var result = rng.logseries(0.5, 1);
256256

257257
result.size.Should().Be(1);
258258
result.shape.Should().BeEquivalentTo(new[] { 1 });
@@ -261,10 +261,10 @@ public void Logseries_Size1_ReturnsSingleElementArray()
261261
[Test]
262262
public void Logseries_VariousP_AllValuesPositive()
263263
{
264-
np.random.seed(42);
264+
var rng = np.random.RandomState(42);
265265
foreach (double p in new[] { 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 0.99 })
266266
{
267-
var result = np.random.logseries(p, 100);
267+
var result = rng.logseries(p, 100);
268268
var data = result.ToArray<long>();
269269

270270
foreach (var v in data)

test/NumSharp.UnitTest/RandomSampling/np.random.multivariate_normal.Test.cs

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespace NumSharp.UnitTest.RandomSampling
55
{
66
/// <summary>
7-
/// Tests for np.random.multivariate_normal
7+
/// Tests for rng.multivariate_normal
88
/// Reference: https://numpy.org/doc/stable/reference/random/generated/numpy.random.multivariate_normal.html
99
/// </summary>
1010

@@ -13,11 +13,11 @@ public class NpRandomMultivariateNormalTests : TestClass
1313
[Test]
1414
public void MultivariateNormal_SingleSample_Returns1DArray()
1515
{
16-
np.random.seed(42);
16+
var rng = np.random.RandomState(42);
1717
var mean = new double[] { 0, 0 };
1818
var cov = new double[,] { { 1, 0 }, { 0, 1 } };
1919

20-
var result = np.random.multivariate_normal(mean, cov);
20+
var result = rng.multivariate_normal(mean, cov);
2121

2222
Assert.AreEqual(1, result.ndim);
2323
Assert.AreEqual(2, result.shape[0]);
@@ -26,11 +26,11 @@ public void MultivariateNormal_SingleSample_Returns1DArray()
2626
[Test]
2727
public void MultivariateNormal_MultipleSamples_ReturnsCorrectShape()
2828
{
29-
np.random.seed(42);
29+
var rng = np.random.RandomState(42);
3030
var mean = new double[] { 0, 0 };
3131
var cov = new double[,] { { 1, 0 }, { 0, 1 } };
3232

33-
var result = np.random.multivariate_normal(mean, cov, 100);
33+
var result = rng.multivariate_normal(mean, cov, 100);
3434

3535
Assert.AreEqual(2, result.ndim);
3636
Assert.AreEqual(100, result.shape[0]);
@@ -40,11 +40,11 @@ public void MultivariateNormal_MultipleSamples_ReturnsCorrectShape()
4040
[Test]
4141
public void MultivariateNormal_TupleSize_ReturnsCorrectShape()
4242
{
43-
np.random.seed(42);
43+
var rng = np.random.RandomState(42);
4444
var mean = new double[] { 0, 0 };
4545
var cov = new double[,] { { 1, 0 }, { 0, 1 } };
4646

47-
var result = np.random.multivariate_normal(mean, cov, new Shape(2, 3));
47+
var result = rng.multivariate_normal(mean, cov, new Shape(2, 3));
4848

4949
Assert.AreEqual(3, result.ndim);
5050
Assert.AreEqual(2, result.shape[0]);
@@ -55,11 +55,11 @@ public void MultivariateNormal_TupleSize_ReturnsCorrectShape()
5555
[Test]
5656
public void MultivariateNormal_Samples_HaveCorrectMean()
5757
{
58-
np.random.seed(42);
58+
var rng = np.random.RandomState(42);
5959
var mean = new double[] { 5, -3 };
6060
var cov = new double[,] { { 1, 0 }, { 0, 1 } };
6161

62-
var samples = np.random.multivariate_normal(mean, cov, 10000);
62+
var samples = rng.multivariate_normal(mean, cov, 10000);
6363

6464
double sum0 = 0, sum1 = 0;
6565
for (int i = 0; i < 10000; i++)
@@ -77,11 +77,11 @@ public void MultivariateNormal_Samples_HaveCorrectMean()
7777
[Test]
7878
public void MultivariateNormal_DiagonalCovariance_HasCorrectVariances()
7979
{
80-
np.random.seed(42);
80+
var rng = np.random.RandomState(42);
8181
var mean = new double[] { 0, 0 };
8282
var cov = new double[,] { { 1, 0 }, { 0, 4 } }; // var[0]=1, var[1]=4
8383

84-
var samples = np.random.multivariate_normal(mean, cov, 10000);
84+
var samples = rng.multivariate_normal(mean, cov, 10000);
8585

8686
// Compute sample variances
8787
double mean0 = 0, mean1 = 0;
@@ -109,11 +109,11 @@ public void MultivariateNormal_DiagonalCovariance_HasCorrectVariances()
109109
[Test]
110110
public void MultivariateNormal_CorrelatedVariables_HaveCorrectCovariance()
111111
{
112-
np.random.seed(42);
112+
var rng = np.random.RandomState(42);
113113
var mean = new double[] { 0, 0 };
114114
var cov = new double[,] { { 1, 0.5 }, { 0.5, 1 } };
115115

116-
var samples = np.random.multivariate_normal(mean, cov, 10000);
116+
var samples = rng.multivariate_normal(mean, cov, 10000);
117117

118118
// Compute sample covariance
119119
double mean0 = 0, mean1 = 0;
@@ -139,11 +139,11 @@ public void MultivariateNormal_CorrelatedVariables_HaveCorrectCovariance()
139139
[Test]
140140
public void MultivariateNormal_ThreeDimensional_Works()
141141
{
142-
np.random.seed(42);
142+
var rng = np.random.RandomState(42);
143143
var mean = new double[] { 1, 2, 3 };
144144
var cov = new double[,] { { 1, 0.2, 0.1 }, { 0.2, 1, 0.3 }, { 0.1, 0.3, 1 } };
145145

146-
var samples = np.random.multivariate_normal(mean, cov, 1000);
146+
var samples = rng.multivariate_normal(mean, cov, 1000);
147147

148148
Assert.AreEqual(2, samples.ndim);
149149
Assert.AreEqual(1000, samples.shape[0]);
@@ -153,11 +153,11 @@ public void MultivariateNormal_ThreeDimensional_Works()
153153
[Test]
154154
public void MultivariateNormal_OneDimensional_Works()
155155
{
156-
np.random.seed(42);
156+
var rng = np.random.RandomState(42);
157157
var mean = new double[] { 5 };
158158
var cov = new double[,] { { 4 } }; // variance = 4, stdev = 2
159159

160-
var samples = np.random.multivariate_normal(mean, cov, 10000);
160+
var samples = rng.multivariate_normal(mean, cov, 10000);
161161

162162
Assert.AreEqual(10000, samples.shape[0]);
163163
Assert.AreEqual(1, samples.shape[1]);
@@ -182,11 +182,11 @@ public void MultivariateNormal_OneDimensional_Works()
182182
[Test]
183183
public void MultivariateNormal_IdentityCovariance_ProducesUncorrelatedSamples()
184184
{
185-
np.random.seed(42);
185+
var rng = np.random.RandomState(42);
186186
var mean = new double[] { 0, 0, 0 };
187187
var cov = new double[,] { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } };
188188

189-
var samples = np.random.multivariate_normal(mean, cov, 10000);
189+
var samples = rng.multivariate_normal(mean, cov, 10000);
190190

191191
// Compute sample correlation between dim 0 and dim 1
192192
double mean0 = 0, mean1 = 0;
@@ -215,11 +215,11 @@ public void MultivariateNormal_IdentityCovariance_ProducesUncorrelatedSamples()
215215
[Test]
216216
public void MultivariateNormal_NDArrayInput_Works()
217217
{
218-
np.random.seed(42);
218+
var rng = np.random.RandomState(42);
219219
var mean = np.array(new double[] { 0, 0 });
220220
var cov = np.array(new double[,] { { 1, 0 }, { 0, 1 } });
221221

222-
var result = np.random.multivariate_normal(mean, cov, new Shape(100));
222+
var result = rng.multivariate_normal(mean, cov, new Shape(100));
223223

224224
Assert.AreEqual(100, result.shape[0]);
225225
Assert.AreEqual(2, result.shape[1]);
@@ -299,13 +299,13 @@ public void MultivariateNormal_CheckValidRaise_ThrowsForNonPositiveDefinite()
299299
[Test]
300300
public void MultivariateNormal_CheckValidIgnore_ReturnsResultForNonPositiveDefinite()
301301
{
302-
np.random.seed(42);
302+
var rng = np.random.RandomState(42);
303303
var mean = new double[] { 0, 0 };
304304
// Not positive definite but we're ignoring
305305
var cov = new double[,] { { 1, 2 }, { 2, 1 } };
306306

307307
// Should not throw with check_valid="ignore"
308-
var result = np.random.multivariate_normal(mean, cov, null, "ignore");
308+
var result = rng.multivariate_normal(mean, cov, null, "ignore");
309309

310310
Assert.AreEqual(1, result.ndim);
311311
Assert.AreEqual(2, result.shape[0]);
@@ -314,7 +314,7 @@ public void MultivariateNormal_CheckValidIgnore_ReturnsResultForNonPositiveDefin
314314
[Test]
315315
public void MultivariateNormal_LargeDimension_Works()
316316
{
317-
np.random.seed(42);
317+
var rng = np.random.RandomState(42);
318318
int n = 10;
319319
var mean = new double[n];
320320
var cov = new double[n, n];
@@ -324,7 +324,7 @@ public void MultivariateNormal_LargeDimension_Works()
324324
cov[i, i] = 1.0; // Identity covariance
325325
}
326326

327-
var samples = np.random.multivariate_normal(mean, cov, 100);
327+
var samples = rng.multivariate_normal(mean, cov, 100);
328328

329329
Assert.AreEqual(100, samples.shape[0]);
330330
Assert.AreEqual(n, samples.shape[1]);
@@ -333,11 +333,11 @@ public void MultivariateNormal_LargeDimension_Works()
333333
[Test]
334334
public void MultivariateNormal_ReturnsDtype_Double()
335335
{
336-
np.random.seed(42);
336+
var rng = np.random.RandomState(42);
337337
var mean = new double[] { 0, 0 };
338338
var cov = new double[,] { { 1, 0 }, { 0, 1 } };
339339

340-
var result = np.random.multivariate_normal(mean, cov, 10);
340+
var result = rng.multivariate_normal(mean, cov, 10);
341341

342342
Assert.AreEqual(typeof(double), result.dtype);
343343
}

0 commit comments

Comments
 (0)