
Thank Kevin, Agreed, syntax doesn't change much, but your implementation is more lightweight. It doesn't add only two symbols though, it adds: generator_ grng_setGenerator() grng_generator() grng_randomVariable() or do you put those in their own namespace? Thanks again, I've been enlightened. Best, Diederick On Mon, Aug 17, 2009 at 3:25 PM, Kevin Martin<kev82@khn.org.uk> wrote:
On 17 Aug 2009, at 04:51, Diederick C. Niehorster wrote:
I have decided to try to do without the whole singleton (although I don't really see what the point is of avoiding a singleton if we still have a global pointer, its almost the same thing) as an exercise and try out Kevin's implementation.
A singleton is extra code and extra work to maintain. Why create yourself more classes, more namespace pollution, and a more complex system when it is not necessary.
I think I am just anti singleton. I believe it is far too overused, and apart from in a few niche cases provides nothing but additional complexity.
Hmm, i have tried so, but the syntax to actually extract the random numbers becomes very complicated now (I think i am missing a point here, i am new to boost.function).
Your method 2 is the one I use (except I use =) I wouldn't say it is a lot of typing, or particularly complicated, most editors will let you autocomplete the grng_function and the distribution name, so it's only about 15 keystrokes. In fact it is no different to
CRandom<boost::uniform_int<int>> Cr(1,100);
If you really wanted you could define a macro to make the function call for you, kind of equivalent to your typedef. I think that would make it harder to read though and not easier, as you would need a macro for each distribution.
The reason I like it because I find it very readable and it only adds two symbols to the namespace. Take this code for example, if you had a separate wrapper class for the two distributions, would it be easier to read?
(Note I use the old syntax for boost::function because I don't like the new one)
boost::shared_ptr<boost::multi_array<int, 2> > vals = fbc_extractCellValues(board); MatrixSwap ms(*vals);
boost::function0<bool> RVswapRow = grng_randomVariable( boost::bernoulli_distribution<>()); boost::function0<int> RVindex = grng_randomVariable( boost::uniform_smallint<>(0, board.boardSize()-1));
for(int i=0;i!=10000;++i) { int idx1 = 0, idx2 = 0; while(idx1 == idx2) { idx1 = RVindex(); idx2 = RVindex(); } if(RVswapRow()) { ms.swapRows(idx1, idx2); } else { ms.swapCols(idx1, idx2); } }
Thanks, Kevin Martin _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users