Skip to content

Commit 6153116

Browse files
authored
Merge pull request #5202 from wilzbach/derandomize-std-algorithm
Derandomize std.algorithm
2 parents c337bbf + b46bd29 commit 6153116

File tree

1 file changed

+43
-31
lines changed

1 file changed

+43
-31
lines changed

std/algorithm/sorting.d

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -883,26 +883,31 @@ if (ss == SwapStrategy.unstable && isRandomAccessRange!Range
883883

884884
@safe unittest
885885
{
886-
import std.random : uniform;
886+
import std.random : Random, uniform, unpredictableSeed;
887887

888-
auto a = new int[](uniform(0, 100));
889-
foreach (ref e; a)
890-
{
891-
e = uniform(0, 50);
892-
}
893-
auto pieces = partition3(a, 25);
894-
assert(pieces[0].length + pieces[1].length + pieces[2].length == a.length);
895-
foreach (e; pieces[0])
896-
{
897-
assert(e < 25);
898-
}
899-
foreach (e; pieces[1])
900-
{
901-
assert(e == 25);
902-
}
903-
foreach (e; pieces[2])
888+
immutable uint[] seeds = [3923355730, 1927035882, unpredictableSeed];
889+
foreach (s; seeds)
904890
{
905-
assert(e > 25);
891+
auto r = Random(s);
892+
auto a = new int[](uniform(0, 100, r));
893+
foreach (ref e; a)
894+
{
895+
e = uniform(0, 50);
896+
}
897+
auto pieces = partition3(a, 25);
898+
assert(pieces[0].length + pieces[1].length + pieces[2].length == a.length);
899+
foreach (e; pieces[0])
900+
{
901+
assert(e < 25);
902+
}
903+
foreach (e; pieces[1])
904+
{
905+
assert(e == 25);
906+
}
907+
foreach (e; pieces[2])
908+
{
909+
assert(e > 25);
910+
}
906911
}
907912
}
908913

@@ -3500,24 +3505,31 @@ private T[] randomArray(Flag!"exactSize" flag = No.exactSize, T = int)(
35003505
{
35013506
import std.algorithm.comparison : max, min;
35023507
import std.algorithm.iteration : reduce;
3503-
import std.random : uniform;
3508+
import std.random : Random, uniform, unpredictableSeed;
35043509

35053510
debug(std_algorithm) scope(success)
35063511
writeln("unittest @", __FILE__, ":", __LINE__, " done.");
35073512

3508-
int[] a = new int[uniform(1, 10000)];
3509-
foreach (ref e; a) e = uniform(-1000, 1000);
3510-
auto k = uniform(0, a.length);
3511-
topN(a, k);
3512-
if (k > 0)
3513+
immutable uint[] seeds = [90027751, 2709791795, 1374631933, 995751648, 3541495258, 984840953, unpredictableSeed];
3514+
foreach (s; seeds)
35133515
{
3514-
auto left = reduce!max(a[0 .. k]);
3515-
assert(left <= a[k]);
3516-
}
3517-
if (k + 1 < a.length)
3518-
{
3519-
auto right = reduce!min(a[k + 1 .. $]);
3520-
assert(right >= a[k]);
3516+
auto r = Random(s);
3517+
3518+
int[] a = new int[uniform(1, 10000, r)];
3519+
foreach (ref e; a) e = uniform(-1000, 1000, r);
3520+
3521+
auto k = uniform(0, a.length, r);
3522+
topN(a, k);
3523+
if (k > 0)
3524+
{
3525+
auto left = reduce!max(a[0 .. k]);
3526+
assert(left <= a[k]);
3527+
}
3528+
if (k + 1 < a.length)
3529+
{
3530+
auto right = reduce!min(a[k + 1 .. $]);
3531+
assert(right >= a[k]);
3532+
}
35213533
}
35223534
}
35233535

0 commit comments

Comments
 (0)