Skip to content
Snippets Groups Projects
Commit 9df578f4 authored by Andrew Heather's avatar Andrew Heather
Browse files

ENH: Random numbers - added re-entrant random interface

parent 4ce77f68
Branches
Tags
No related merge requests found
......@@ -59,7 +59,6 @@ Description
#include <link.h>
#include <netinet/in.h>
#ifdef USE_RANDOM
#include <climits>
#if INT_MAX != 2147483647
......@@ -1430,6 +1429,15 @@ Foam::fileNameList Foam::dlLoaded()
return libs;
}
Foam::label Foam::osRandomBufferSize()
{
#ifdef USE_RANDOM
return sizeof(random_data);
#else
return sizeof(drand48_data);
#endif
}
void Foam::osRandomSeed(const label seed)
{
......@@ -1461,4 +1469,42 @@ Foam::scalar Foam::osRandomDouble()
}
void Foam::osRandomSeed(const label seed, List<char>& buffer)
{
#ifdef USE_RANDOM
srandom_r((unsigned int)seed, reinterpret_cast<random_data*>(buffer.begin()));
#else
srand48_r(seed, reinterpret_cast<drand48_data*>(buffer.begin()));
#endif
}
Foam::label Foam::osRandomInteger(List<char>& buffer)
{
#ifdef USE_RANDOM
int32_t result;
random_r(reinterpret_cast<random_data*>(buffer.begin()), &result);
return result;
#else
long result;
lrand48_r(reinterpret_cast<drand48_data*>(buffer.begin()), &result);
return result;
#endif
}
Foam::scalar Foam::osRandomDouble(List<char>& buffer)
{
#ifdef USE_RANDOM
int32_t result;
random_r(reinterpret_cast<random_data*>(buffer.begin()), &result);
return (scalar)result/INT_MAX;
#else
double result;
drand48_r(reinterpret_cast<drand48_data*>(buffer.begin()), &result);
return result;
#endif
}
// ************************************************************************* //
......@@ -245,6 +245,18 @@ label osRandomInteger();
//- Return random double precision (uniform distribution between 0 and 1)
scalar osRandomDouble();
//- Return the size of the buffer for re-entrant random number generator
label osRandomBufferSize();
//- Seed random number generator.
void osRandomSeed(const label seed, List<char>& buffer);
//- Return random integer (uniform distribution between 0 and 2^31)
label osRandomInteger(List<char>& buffer);
//- Return random double precision (uniform distribution between 0 and 1)
scalar osRandomDouble(List<char>& buffer);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment