generate an array of 100 uniform distributed numbers

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jan 22 11:37:54 PST 2015


On 01/22/2015 11:26 AM, ddos wrote:

 > i want to create 100 uniform distributed numbers and print them
 > my first attempt, just written by intuition:
 > [0 .. 100].map!(v => uniform(0.0, 1.0).writeln);
 >
 > i found out i can't write [0 .. 100] to define a simple number range,

As currently being discussed in another thread, the a..b syntax does not 
correspond to a first-class D language construct.

 > but is there a function to do so?

Yes, std.range.iota:

     auto numbers = iota(100).map!(_ => uniform(0.0, 1.0));

Note that, 'numbers' is lazy, the definition above does not call 
uniform() yet.

To make an array out of it, call std.array.array at the end:

     auto numbers = iota(100).map!(_ => uniform(0.0, 1.0)).array;

 > second attempt, replacing the range with an simple array
 > [0,1,2].map!(v => uniform(0.0,1.0).writeln);
 > this does compile and run, but doesn't print anything, just an empty
 > string, why is that?

What I said above: it is just a range waiting to be used.

 > finally i got it working with this:
 > auto t = [0,1,2].map!(v => uniform(0.0,1.0));
 > writeln(t);
 >
 > seems pretty easy eh?

writeln() consumes any range to print it on the standard output. There 
is no array to speak of though: writeln() consumes a copy of 't' and 
your 't' is still a lazy range waiting to be consumed.

Ali



More information about the Digitalmars-d-learn mailing list