Skip to content

Commit

Permalink
fix issue 18501 - randomShuffle and partialShuffle should return thei…
Browse files Browse the repository at this point in the history
…r input argument
  • Loading branch information
Basile Burg committed Feb 23, 2018
1 parent 1619579 commit b9196a9
Showing 1 changed file with 17 additions and 5 deletions.
22 changes: 17 additions & 5 deletions std/random.d
Expand Up @@ -2104,16 +2104,18 @@ Params:
r = random-access range whose elements are to be shuffled
gen = (optional) random number generator to use; if not
specified, defaults to $(D rndGen)
*/
Returns:
The shuffled random-access range.
*/

void randomShuffle(Range, RandomGen)(Range r, ref RandomGen gen)
Range randomShuffle(Range, RandomGen)(Range r, ref RandomGen gen)
if (isRandomAccessRange!Range && isUniformRNG!RandomGen)
{
return partialShuffle!(Range, RandomGen)(r, r.length, gen);
}

/// ditto
void randomShuffle(Range)(Range r)
Range randomShuffle(Range)(Range r)
if (isRandomAccessRange!Range)
{
return randomShuffle(r, rndGen);
Expand All @@ -2137,6 +2139,13 @@ if (isRandomAccessRange!Range)
}
}

@safe unittest // bugzilla 18501
{
import std.algorithm.comparison : among;
auto r = randomShuffle([0,1]);
assert(r.among([0,1],[1,0]));
}

/**
Partially shuffles the elements of $(D r) such that upon returning $(D r[0 .. n])
is a random subset of $(D r) and is randomly ordered. $(D r[n .. r.length])
Expand All @@ -2154,8 +2163,10 @@ Params:
must be less than $(D r.length)
gen = (optional) random number generator to use; if not
specified, defaults to $(D rndGen)
Returns:
The shuffled random-access range.
*/
void partialShuffle(Range, RandomGen)(Range r, in size_t n, ref RandomGen gen)
Range partialShuffle(Range, RandomGen)(Range r, in size_t n, ref RandomGen gen)
if (isRandomAccessRange!Range && isUniformRNG!RandomGen)
{
import std.algorithm.mutation : swapAt;
Expand All @@ -2165,10 +2176,11 @@ if (isRandomAccessRange!Range && isUniformRNG!RandomGen)
{
r.swapAt(i, uniform(i, r.length, gen));
}
return r;
}

/// ditto
void partialShuffle(Range)(Range r, in size_t n)
Range partialShuffle(Range)(Range r, in size_t n)
if (isRandomAccessRange!Range)
{
return partialShuffle(r, n, rndGen);
Expand Down

0 comments on commit b9196a9

Please sign in to comment.