bearophile Wrote: > Some kind of little D programs I write need a lot of random values, and tests > have shown me that std.random.uniform is slow. > > So I have suggested to add a faster special case to generate a random double > in [0.0, 1.0), see: > http://d.puremagic.com/issues/show_bug.cgi?id=5240 > > Bye, > bearophile
I did some testing with different combinations of types and boundary types. The problem noticed is a bit different to the one bearophile mentioned. Here is my test code: -------------------- import std.conv; import std.date; import std.random; import std.stdio; void test(T, string boundaries)() { void fun() { uniform!(boundaries, T, T)(cast(T)0, cast(T)1000); } writefln("%-8s %s %6d", to!string(typeid(T)), boundaries, benchmark!fun(10_000_000)[0]); } void testBoundaries(T)() { test!(T, "[]")(); test!(T, "[)")(); test!(T, "(]")(); test!(T, "()")(); writeln(); } void main() { testBoundaries!(int)(); testBoundaries!(long)(); testBoundaries!(float)(); testBoundaries!(double)(); testBoundaries!(real)(); } -------------------- And here are the results for 10 million calls of uniform (columns are: type, boundaries, elapsed time): -------------------- int [] 271 int [) 271 int (] 283 int () 285 long [] 372 long [) 399 long (] 401 long () 397 float [] 286 float [) 374 float (] 5252 float () 5691 double [] 348 double [) 573 double (] 5319 double () 5875 real [] 434 real [) 702 real (] 2832 real () 3056 -------------------- In my opinion floating point uniforms with (] or () as boundary types are unacceptably slow. I had to use 1 - uniform!"[)"(0.0, 1.0) instead of uniform!"(]"(0.0, 1.0) because of this issue. I would also expect versions using float and double to be faster than the version using real. -- tn