From f0806d5d7c1eb4f9e4abc82150c5aa3e0e25e713 Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@esi-group.com> Date: Wed, 13 Jun 2018 12:38:13 +0200 Subject: [PATCH] BUG: non-uniform distribution for Random::position<label> (closes #865) - use floor/truncate instead of round. Backport of changes in the develop-pre-release branch. --- .../primitives/random/Random/Random.C | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/OpenFOAM/primitives/random/Random/Random.C b/src/OpenFOAM/primitives/random/Random/Random.C index c17f5c26689..13073f586e3 100644 --- a/src/OpenFOAM/primitives/random/Random/Random.C +++ b/src/OpenFOAM/primitives/random/Random/Random.C @@ -151,7 +151,24 @@ Foam::scalar Foam::Random::position template<> Foam::label Foam::Random::position(const label& start, const label& end) { - return start + round(scalar01()*(end - start)); + #ifdef FULLDEBUG + if (start > end) + { + FatalErrorInFunction + << "start index " << start << " > end index " << end << nl + << abort(FatalError); + } + #endif + + // Extend the upper sampling range by 1 and floor the result. + // Since the range is non-negative, can use integer truncation + // instead using floor(). + + const label val = start + label(scalar01()*(end - start + 1)); + + // Rare case when scalar01() returns exactly 1.000 and the truncated + // value would be out of range. + return min(val, end); } @@ -230,12 +247,12 @@ Foam::scalar Foam::Random::globalPosition if (Pstream::master()) { - value = scalar01()*(end - start); + value = position<scalar>(start, end); } Pstream::scatter(value); - return start + value; + return value; } @@ -250,12 +267,12 @@ Foam::label Foam::Random::globalPosition if (Pstream::master()) { - value = round(scalar01()*(end - start)); + value = position<label>(start, end); } Pstream::scatter(value); - return start + value; + return value; } -- GitLab