[Issue 11738] partialShuffle actually shuffles the entire input
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Tue May 19 07:28:32 PDT 2015
https://issues.dlang.org/show_bug.cgi?id=11738
Ivan Kazmenko <gassa at mail.ru> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|RESOLVED |REOPENED
CC| |gassa at mail.ru
Resolution|FIXED |---
--- Comment #2 from Ivan Kazmenko <gassa at mail.ru> ---
Looks like the documented behavior is wanted too:
http://forum.dlang.org/thread/hqzijswbexlsaoeccozr@forum.dlang.org
Suppose we have a random-access range of size M and want to pick N elements
from it. In O(N), we can do two things:
1. Shuffle the first N elements. This is what the function now does:
partialShuffle ([0,1,2,3,4, 5,6,7,8,9], 5) can produce [4,0,2,3,1, 5,6,7,8,9].
2. Bring K random elements to the first N positions. This is what the
documentation implies:
partialShuffle ([0,1,2,3,4, 5,6,7,8,9], 5) can produce [5,9,2,0,3, other
elements in irrelevant order].
The benefit is that we select random N elements from M in O(N), not O(M).
Other elements are still there at positions [N..M]. We can partialShuffle
again with same or different N, and get another random bunch of elements at the
front. The elements at positions [N..M] are neither sorted nor shuffled (some
permutations have zero probability since we did only N swaps).
As pointed out in the D.learn thread linked above, the behavior (1) can already
be obtained by slicing (like theArray[0..K] for an array, or perhaps
theRange.take (K) for a range) and then fully (not partially) shuffling what we
got.
On the other hand, the behavior (2) is not found in Phobos, at least after the
fix.
So I think this fix was an error. I suggest we revert it, like
- swapAt(r, i, uniform(i, n, gen));
+ swapAt(r, i, uniform(i, r.length - i, gen));
Disclaimer: I may have misunderstood the issue, in which case, please explain
what is the intent here.
Ivan Kazmenko.
--
More information about the Digitalmars-d-bugs
mailing list