Sellecting randomly from a range

Jesse Phillips JesseKPhillips at gmail.com
Mon May 18 15:18:34 PDT 2009


On Sun, 17 May 2009 18:08:26 -0400, Jesse Phillips wrote:

> This is more a tutorial which I'll put up on a wiki, but one question I
> have is why can't 0..8 work in a randomCover, and wouldn't it be nice to
> use regex for creating a range ("[A-Z]" being all uppercase letters)?
> 
> Selecting randomly from a collection of elements is common and usually
> entails selecting random numbers and making sure they haven't been used
> before. D2 has several templated functions that when put together make
> this very easy.
> 
> The first thing to look at comes from std.random, randomCover(range,
> rnd). This takes the range of items and creates a new range that is a
> random representation of the elements.
> 
> Then found in std.range is take(count, range). This will give us the
> count items from our range giving us yet another range. From here we are
> able to use a foreach loop to grab each item, but what if we want to
> store this someplace for latter use?
> 
> This brings us to std.algorithms where we find fill(range1, range2). It
> is important to note that D arrays can be use as a range.
> 
> If we combine this with D's array slices you are able to fill the
> results from two ranges. The code below is an example using all of this
> and selecting a random number of elements from each list.
> 
> (If this ends up being poorly formatted I apologize
> http://paste.dprogramming.com/dpi1a1wn )
> 
> import std.algorithm;
> import std.random;
> import std.range;
> import std.stdio;
> 
> string[] list =  ["one", "two", "three", "four", "five"]; string[] list2
> = ["1", "2", "3", "4", "5"];
> 
> void main(string[] args) {
>    auto rnd = new Random(unpredictableSeed);
> 
>    int count = uniform(1, list.length, rnd);
> 
>    string[] result = new string[count*2];
> 
>    fill(result[0..count], take(count, randomCover(list, rnd)));
>    fill(result[count..$], take(count, randomCover(list2, rnd)));
> 
>    writeln(result);
> }

Actually I've some unneeded code, there was no need for using take.

    fill(result[0..count], randomCover(list, rnd));
    fill(result[count..$], randomCover(list2, rnd));


More information about the Digitalmars-d-learn mailing list