On Tuesday, 21 January 2014 at 10:05:42 UTC, terchestor wrote:
I'm a newcomer to D language (after years of programming with ASM Motorola 68030-40 long time ago, as well as C, C++, Javascript, PHP, etc.), but not anymore a professional coder. After reading some articles around there and that nice and cute TDPL (just after Coding standards, another world!), I began to write some to exercise my fresh new "skill". I choose as a first experience, to write a simple class implementing a very interesting random number generator known as Tausworthe, according to the recipe found in this paper: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.101.9723&rep=rep1&type=pdf. The algorithm in C is quite simple and set in Lecuyer's paper as:

unsigned long s1, s2, s3, b;
double taus88 ()
{
 /* Generates numbers between 0 and 1. */
b = (((s1 << 13) ^ s1) >> 19);
s1 = (((s1 & 4294967294) << 12) ^ b);
b = (((s2 << 2) ^ s2) >> 25);
s2 = (((s2 & 4294967288) << 4) ^ b);
b = (((s3 << 3) ^ s3) >> 11);
s3 = (((s3 & 4294967280) << 17) ^ b);
return ((s1 ^ s2 ^ s3) * 2.3283064365e-10);
}

I made some "adjustments" to this algorithm, to yield either a (long) integer or (double) float result, in any range.

Benchmarks
----------
Tausworthe module (rdmd -main -unittest -debug=Benchmark_Tausworthe tausworthe.d)
============================================================
Call 1_000_000 times benchmark_uniform_ulong( ): 30 ms | Average : 3e-05 ms
============================================================
============================================================
Call 1_000_000 times benchmark_uniform_double( ): 42 ms | Average : 4.2e-05 ms
============================================================
============================================================
Call 1_000_000 times benchmark_uniform_std( ): 70 ms | Average : 7e-05 ms
============================================================
Comparing ratio tausworthe / std.random:  0.609229

I'd greatly appreciate any reviewing and testing of my code. Any improvements you feel necessary are most welcome (as said before, I'm a newbie).

What's the best place to publish the code?

Github, bitbucket or equivalent.

If you think it's ready for general use then write a dub.json and register it to code.dlang.org


Take care with modifying random number generators, it's quite easy to ruin them by changing something that seems innocent.

Reply via email to