|
Boost : |
From: Beman Dawes (beman_at_[hidden])
Date: 2000-02-17 14:47:47
At 11:14 PM 2/16/00 +0100, Jens Maurer wrote:
>Back in November last year, Jeet Sukumaran posted a proposal for a
>random number library framework. The original proposal was based
>on a polymorphic class hierarchy, but most of the people who
commented
>felt that some template-based solution might be better.
>
>Unfortunately, I haven't received anything about that subject since.
>
>Thus, I have created a new directory "random" in the doc vault and
>put up my proposal for a framework:
>
>http://www.egroups.com/docvault/boost/random
>
>Similarities to Jeet Sukumaran's proposal are not entirely
coincidental,
>however, mine is completely template-based (not a single virtual
>function).
>
>I have currently implemented the following generators:
>linear congruential (lrand48()-clone, minimal standard (both
variants)),
>mersenne twister (mt11213b, mt19937) (anew from the paper, not LGPL-
>encumbered)
>
>The following distributions are available:
>uniform on real [0..1) and [min,max]
>geometric, exponential, gaussian, uniform on an n-dimensional sphere
>
>I am aware that the implementation still has its rough edges, but
>feel free to comment on that as well.
Great!
* Is there a reason you didn't specify the interface to meet the
RandomNumberGenerator requirements in 25.2.11
[lib.alg.random.shuffle] by providing operator()(long) in addition to
the Generator (operator()()) requirements?
* It often seems useful to be able to get the current rng value (via
value() and/or a conversion operator) without stepping to the next
value. It saves setting up a work variable just to hang on to the
value through a few lines of code.
* Supplying operator++() seems to me to make the intent of user code
clearer:
some_rng_class rng;
while ( ... )
{
f1(++rng); // call a function with a new rng value
f2(rng); // call a function with the current rng value
f2(rng.value()); // some prefer to avoid a conversion
operator
}
* The hyphens in file names make me slightly nervous. For example,
even though Win NT permits the hyphens, VC++ chokes on them in
project names. I think that underscores may be slightly more
portable. Not a big deal one way or the other.
* Another nit: holding source line lengths to a maximum of 80
columns makes it easier to read and print code.
* I tried to compile random-test.cpp. Microsoft VC++ 6.0 sp3
doesn't allow in class initializers, so gets errors on the following.
Maybe some VC++ experts can suggest an easy way around:
static const bool has_fixed_range = true; static const result_type
min_value = 0;
static const result_type max_value = static_cast<result_type>(-1);
* Metrowerks CodeWarrior said this conversion was illegal:
static const result_type max_value = static_cast<result_type>(-1);
* Other CodeWarrior errors:
Error : ambiguous access to overloaded function
'boost::rand48::rand48(long)'
'boost::rand48::rand48(unsigned long long)'
random-test.cpp line 76 rand48 rnd(5);
Error : ambiguous access to overloaded function
'boost::rand48::seed(long)'
'boost::rand48::seed(unsigned long long)'
random-test.cpp line 78 rnd.seed(17);
This points up a problem: some platforms don't yet support long
long; it isn't part of the C++ Standard so #ifdefs are needed, I am
afraid. Metrowerks tries to support it, IFRCC, but overloading
doesn't seem to be working.
* There is an undefined symbol in random.hpp: M_PI
Rough edges aside, this looks like a nice package! Thanks for
working on it.
--Beman
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk