CFD Online Discussion Forums

CFD Online Discussion Forums (
-   OpenFOAM Programming & Development (
-   -   Globally instantiated "Random" (

andersking July 30, 2009 02:08

Globally instantiated "Random"
Hi All,

I have a solver that I have I built that uses random numbers in a number of places. In the existing code, if a new "Random()" object is instantiated in more than one place, the random numbers are re-seeded (usually with the same seed) every time a new object is created.

In 1.5.x I changed Random() to initialise it self, and only reseed if explicitly asked. As follows:

(in Random.H)

        //- Construct given seed
        Random(const label&);
+      Random();
    // Member functions

(in Random.C)

  // construct given seed
 Random::Random(const label& seed)
+    static bool initialised = 0;
    if (seed > 1)
        Seed = seed;


+    if (!initialised) {
#      ifdef USE_RANDOM
            srandom((unsigned int)Seed);
#      else
#      endif
+        initialised = 1;
+    }
+        Random(1);
 int Random::bit()

I am in the process of testing the solver in 1.6.x (git), and am about to port my changes to it.

But before I do, i need to know if what I am doing is a good idea?
will this have any unforseen side effects? (so far I haven't come across any).

Is it worth including upstream?

It should be entirely compatible with existing code, but allows you to grab a random number anywhere by using


Random random();
scalar randno = random.scalar01();

where ever you need it.

Am i missing something?


sisetrun July 12, 2017 10:22

Hey Andrew,

your suggestion is exactly what I am looking for...

Could you please offer the whole part from Random.C since I get an error


my_test.C:52:28: error: request for member ‘scalar01’ in ‘random’, which is of non-class type ‘Foam::Random()’
    scalar randno = random.scalar01();
my_test.C:52:12: warning: unused variable ‘randno’ [-Wunused-variable]
    scalar randno = random.scalar01();

I added the new to my solver...


Best wishes


All times are GMT -4. The time now is 19:27.