On Tuesday, 21 January 2014 at 10:10:32 UTC, John Colvin wrote:
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.

Well, thanks for the advices.
Here it is: https://github.com/Terchestor/dlang/tree/Tausworthe-class

Please be indulgent ,-)

Reply via email to