randomSample
Meta via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat May 17 21:40:11 PDT 2014
On Sunday, 18 May 2014 at 04:19:05 UTC, David Held wrote:
> How do I get an array from randomSample()?
>
> int[] source = [ ... ];
> int[] sample = randomSample(source, 3);
>
> src\main.d(30): Error: cannot implicitly convert expression
> (randomSample(source, 3u)) of type RandomSample!(int[], void)
> to int[]
>
> I get that RandomSample is a struct which implements the
> necessary interface to work with foreach. But the fact that
> this struct is considered a proprietary implementation detail
> of std.random is a constant source of frustration for me.
> Quite a few D libraries use this trick, but the opacity of
> these data structures make it impossible for users to know
> exactly how to use them outside of the one or two examples
> given in the documentation. I don't know how to improve the
> situation, other than documenting them explicitly rather than
> treating them as a magical black box.
>
> In the mean time, can anyone suggest a solution to the above,
> short of actually iterating over it? I suppose someone will
> say to use map!().
>
> Dave
You need to use the function array from std.array.
import std.array;
int[] source = [ ... ];
int[] sample = randomSample(source, 3).array();
Array has the ability to turn any range into an array, and it's
generally how you convert from these structs (which generally
implement a range interface) returned by most range-based
functions in D. It can be a bit confusing at first, but returning
a range struct is much more flexible than returning a simple
array of values.
More information about the Digitalmars-d-learn
mailing list