# [Issue 5249] Strongly pure random generator

`http://d.puremagic.com/issues/show_bug.cgi?id=5249`
```

--- Comment #4 from bearophile_h...@eml.cc 2011-08-30 04:49:26 PDT ---
In dmd 2.055 you are allowed to assign to an immutable value the result of
strongly pure functions. So purity becomes even more useful, and things that
break purity are even less handy. If you want to fill an array of immutables
you can't currently use uniform() as in gen2() because it's not pure:

import std.random;

struct Foo { int x; }

immutable(Foo[]) gen1(in int n) pure {
auto foos = new Foo[n];
foreach (i, ref f; foos)
f = Foo(i);
return foos;
}

// gen2 can't be pure because of uniform(),
// so I can't cast its result to immutable
const(Foo[]) gen2(in int n) /*pure*/ {
auto foos = new Foo[n];
foreach (ref f; foos)
f = Foo(uniform(0, 100));
return foos;
}

void main() {
immutable foos1 = gen1(10);
//immutable foos2 = gen2(10);
const foos2 = gen2(10);
}

With a strongly pure rnd generator functions you are allowed to generate an
array of immutable random values efficiently (efficiently means without using
array append):

import std.random;

struct Foo { int x; }

Tuple!(Foo[], TSeed) gen3(TSeed)(in int n, in TSeed seed) pure {
auto foos = new Foo[n];
foreach (ref f; foos) {
(int rndValue, seed) = nextUniform(seed, 0, 100);
f = Foo(rndValue);
}
return typeof(return)(foos, seed);
}

void main() {
immutable foos3 = gen3(10);
}

--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
```