summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2014-10-03 17:12:23 +0100
committerCaolán McNamara <caolanm@redhat.com>2014-10-06 14:13:27 +0100
commit8f436d3de7e99268a8862664d2cb2574231c3b18 (patch)
tree0a07dd3cecbd7bc5b0293006bb8691e33c5cca75
parente5ab3685550cf35c3eb9cb47530044f2d86433d5 (diff)
use comphelper::rng::uniform_*_distribution everywhere
and automatically seed from time on first use coverity#1242393 Don't call rand coverity#1242404 Don't call rand coverity#1242410 Don't call rand and additionally allow 0xFF as a value coverity#1242409 Don't call rand coverity#1242399 Don't call rand coverity#1242372 Don't call rand coverity#1242377 Don't call rand coverity#1242378 Don't call rand coverity#1242379 Don't call rand coverity#1242382 Don't call rand coverity#1242383 Don't call rand coverity#1242402 Don't call rand coverity#1242397 Don't call rand coverity#1242390 Don't call rand coverity#1242389 Don't call rand coverity#1242388 Don't call rand coverity#1242386 Don't call rand coverity#1242384 Don't call rand coverity#1242394 Don't call rand Change-Id: I241feab9cb370e091fd6ccaba2af941eb95bc7cf
-rw-r--r--basegfx/CppunitTest_basegfx.mk1
-rw-r--r--basegfx/test/boxclipper.cxx4
-rw-r--r--basic/source/runtime/methods.cxx4
-rw-r--r--comphelper/source/misc/random.cxx58
-rw-r--r--cui/source/customize/cfg.cxx4
-rw-r--r--desktop/source/deployment/misc/lockfile.cxx8
-rw-r--r--drawinglayer/source/primitive2d/polygonprimitive2d.cxx16
-rw-r--r--drawinglayer/source/texture/texture.cxx9
-rw-r--r--include/comphelper/random.hxx21
-rw-r--r--include/drawinglayer/tools/converters.hxx2
-rw-r--r--oox/source/export/chartexport.cxx4
-rw-r--r--sc/Library_scopencl.mk1
-rw-r--r--sc/source/core/data/global.cxx2
-rw-r--r--sc/source/core/data/table3.cxx5
-rw-r--r--sc/source/core/opencl/opencl_device.cxx4
-rw-r--r--sc/source/core/tool/interpr1.cxx2
-rw-r--r--sc/source/core/tool/interpr3.cxx3
-rw-r--r--sc/source/ui/StatisticsDialogs/SamplingDialog.cxx13
-rw-r--r--scaddins/idl/com/sun/star/sheet/addin/XAnalysis.idl2
-rw-r--r--scaddins/source/analysis/analysis.cxx9
-rw-r--r--sd/source/core/CustomAnimationPreset.cxx7
-rw-r--r--sd/source/ui/remotecontrol/AvahiNetworkService.cxx5
-rw-r--r--slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx4
-rw-r--r--slideshow/source/inc/tools.hxx5
-rw-r--r--svx/source/svdraw/sdrpagewindow.cxx6
-rw-r--r--svx/source/svdraw/sdrpaintwindow.cxx32
-rw-r--r--sw/qa/core/uwriter.cxx16
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx9
-rw-r--r--vbahelper/source/vbahelper/vbacommandbarhelper.cxx4
-rw-r--r--vcl/source/window/debugevent.cxx3
-rw-r--r--xmloff/source/text/txtlists.cxx4
31 files changed, 149 insertions, 118 deletions
diff --git a/basegfx/CppunitTest_basegfx.mk b/basegfx/CppunitTest_basegfx.mk
index d3bb56f088fb..8f34f3bb6728 100644
--- a/basegfx/CppunitTest_basegfx.mk
+++ b/basegfx/CppunitTest_basegfx.mk
@@ -18,6 +18,7 @@ $(eval $(call gb_CppunitTest_use_api,basegfx,\
$(eval $(call gb_CppunitTest_use_libraries,basegfx,\
basegfx \
+ comphelper \
cppu \
cppuhelper \
sal \
diff --git a/basegfx/test/boxclipper.cxx b/basegfx/test/boxclipper.cxx
index 7ce2acf719e9..54e5e96071ac 100644
--- a/basegfx/test/boxclipper.cxx
+++ b/basegfx/test/boxclipper.cxx
@@ -33,6 +33,7 @@
#include <basegfx/polygon/b2dpolygonclipper.hxx>
#include <basegfx/polygon/b2dpolypolygon.hxx>
#include <basegfx/numeric/ftools.hxx>
+#include <comphelper/random.hxx>
#include <boost/bind.hpp>
@@ -47,8 +48,7 @@ double getRandomOrdinal( const ::std::size_t n )
{
// use this one when displaying polygons in OOo, which still sucks
// great rocks when trying to import non-integer svg:d attributes
- // return sal_Int64(double(n) * rand() / (RAND_MAX + 1.0));
- return double(n) * rand() / (RAND_MAX + 1.0);
+ return comphelper::rng::uniform_int_distribution(static_cast<size_t>(0), n-1);
}
inline bool compare(const B2DPoint& left, const B2DPoint& right)
diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx
index 4c6c87779967..3ccc46e994c7 100644
--- a/basic/source/runtime/methods.cxx
+++ b/basic/source/runtime/methods.cxx
@@ -3528,7 +3528,7 @@ RTLFUNC(Randomize)
{
nSeed = (int)time(NULL);
}
- comphelper::rng::seed( nSeed );
+ comphelper::rng::reseed(nSeed);
}
RTLFUNC(Rnd)
@@ -3542,7 +3542,7 @@ RTLFUNC(Rnd)
}
else
{
- rPar.Get(0)->PutDouble( comphelper::rng::uniform() );
+ rPar.Get(0)->PutDouble(comphelper::rng::uniform_real_distribution());
}
}
diff --git a/comphelper/source/misc/random.cxx b/comphelper/source/misc/random.cxx
index a97608649bbf..4fb4a1fde08d 100644
--- a/comphelper/source/misc/random.cxx
+++ b/comphelper/source/misc/random.cxx
@@ -11,8 +11,8 @@
*/
#include <boost/random.hpp>
-
#include <comphelper/random.hxx>
+#include <rtl/instance.hxx>
// this is nothing but a simple wrapper around
// the boost random generators
@@ -29,23 +29,55 @@ namespace rng
// memory requirement: 625*sizeof(uint32_t)
// http://en.wikipedia.org/wiki/Mersenne_twister
#define BOOST_RNG_ALGO boost::mt19937
-BOOST_RNG_ALGO global_rng;
-// initialises the state of the global random number generator
-// should only be called once at the start of the main programme
-// (note, a few boost::variate_generator<> (like normal) have their
-// own state which would need a reset as well to guarantee identical
-// sequence of numbers, e.g. via myrand.distribution().reset())
-void seed(int i)
+struct RandomNumberGenerator
+{
+ BOOST_RNG_ALGO global_rng;
+ RandomNumberGenerator()
+ {
+ // initialises the state of the global random number generator
+ // should only be called once.
+ // (note, a few boost::variate_generator<> (like normal) have their
+ // own state which would need a reset as well to guarantee identical
+ // sequence of numbers, e.g. via myrand.distribution().reset())
+ global_rng.seed(time(NULL));
+ }
+};
+
+class theRandomNumberGenerator : public rtl::Static<RandomNumberGenerator, theRandomNumberGenerator> {};
+
+// re-initialises the state of the global random number generator
+void reseed(int i)
+{
+ return theRandomNumberGenerator::get().global_rng.seed(i);
+}
+
+// uniform ints [a,b] distribution
+int uniform_int_distribution(int a, int b)
+{
+ boost::random::uniform_int_distribution<int> dist(a, b);
+ return dist(theRandomNumberGenerator::get().global_rng);
+}
+
+// uniform ints [a,b] distribution
+unsigned int uniform_int_distribution(unsigned int a, unsigned int b)
+{
+ boost::random::uniform_int_distribution<unsigned int> dist(a, b);
+ return dist(theRandomNumberGenerator::get().global_rng);
+}
+
+// uniform size_t [a,b] distribution
+size_t uniform_int_distribution(size_t a, size_t b)
{
- global_rng.seed(i);
+ boost::random::uniform_int_distribution<size_t> dist(a, b);
+ return dist(theRandomNumberGenerator::get().global_rng);
}
-// uniform [0,1) or [a,b) distribution
-double uniform()
+// uniform size_t [a,b) distribution
+double uniform_real_distribution(double a, double b)
{
- static boost::uniform_01<BOOST_RNG_ALGO&> myrand(global_rng);
- return myrand();
+ boost::random::uniform_real_distribution<double> dist(a, b);
+ return dist(theRandomNumberGenerator::get().global_rng);
}
} // namespace
diff --git a/cui/source/customize/cfg.cxx b/cui/source/customize/cfg.cxx
index 30a7b8a26cf9..a8adf2f43ca0 100644
--- a/cui/source/customize/cfg.cxx
+++ b/cui/source/customize/cfg.cxx
@@ -63,6 +63,7 @@
#include <comphelper/documentinfo.hxx>
#include <comphelper/processfactory.hxx>
+#include <comphelper/random.hxx>
#include <unotools/configmgr.hxx>
#include <com/sun/star/embed/ElementModes.hpp>
#include <com/sun/star/embed/FileSystemStorageFactory.hpp>
@@ -297,8 +298,7 @@ generateCustomName(
sal_uInt32 generateRandomValue()
{
- srand( unsigned( time( NULL ) ));
- return sal_uInt32( rand() );
+ return comphelper::rng::uniform_int_distribution(static_cast<unsigned int>(0), std::numeric_limits<unsigned int>::max());
}
OUString
diff --git a/desktop/source/deployment/misc/lockfile.cxx b/desktop/source/deployment/misc/lockfile.cxx
index 96d9dce076db..1f3d2f2a86ce 100644
--- a/desktop/source/deployment/misc/lockfile.cxx
+++ b/desktop/source/deployment/misc/lockfile.cxx
@@ -24,6 +24,7 @@
#else
#include <windows.h>
#endif
+#include <comphelper/random.hxx>
#include <sal/types.h>
#include <osl/file.hxx>
#include <osl/socket.hxx>
@@ -33,7 +34,6 @@
#include "lockfile.hxx"
-
using namespace ::osl;
using namespace ::rtl;
using namespace ::utl;
@@ -85,11 +85,9 @@ namespace desktop {
// generate ID
const int nIdBytes = 16;
char tmpId[nIdBytes*2+1];
- time_t t;
- srand( (unsigned)(t = time( NULL )) );
- int tmpByte = 0;
+ time_t t = time(NULL);
for (int i = 0; i<nIdBytes; i++) {
- tmpByte = rand( ) % 0xFF;
+ int tmpByte = comphelper::rng::uniform_int_distribution(0, 0xFF);
sprintf( tmpId+i*2, "%02X", tmpByte );
}
tmpId[nIdBytes*2]=0x00;
diff --git a/drawinglayer/source/primitive2d/polygonprimitive2d.cxx b/drawinglayer/source/primitive2d/polygonprimitive2d.cxx
index 79a5e9e10c54..4a2944be5bb0 100644
--- a/drawinglayer/source/primitive2d/polygonprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/polygonprimitive2d.cxx
@@ -25,9 +25,9 @@
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
#include <drawinglayer/geometry/viewinformation2d.hxx>
#include <basegfx/polygon/b2dlinegeometry.hxx>
+#include <boost/math/special_functions/next.hpp>
#include <com/sun/star/drawing/LineCap.hpp>
-
-
+#include <comphelper/random.hxx>
using namespace com::sun::star;
@@ -212,10 +212,16 @@ namespace drawinglayer
} // end of namespace primitive2d
} // end of namespace drawinglayer
-
-
namespace drawinglayer
{
+ namespace tools
+ {
+ double getRandomColorRange()
+ {
+ return comphelper::rng::uniform_real_distribution(0.0, boost::math::nextafter(1.0, DBL_MAX));
+ }
+ }
+
namespace primitive2d
{
Primitive2DSequence PolygonStrokePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
@@ -271,7 +277,7 @@ namespace drawinglayer
const basegfx::B2DPolyPolygon aNewPolyPolygon(aAreaPolyPolygon.getB2DPolygon(b));
static bool bTestByUsingRandomColor(false);
const basegfx::BColor aColor(bTestByUsingRandomColor
- ? basegfx::BColor(rand() / 32767.0, rand() / 32767.0, rand() / 32767.0)
+ ? basegfx::BColor(tools::getRandomColorRange(), tools::getRandomColorRange(), tools::getRandomColorRange())
: getLineAttribute().getColor());
const Primitive2DReference xRef(new PolyPolygonColorPrimitive2D(aNewPolyPolygon, aColor));
aRetval[b] = xRef;
diff --git a/drawinglayer/source/texture/texture.cxx b/drawinglayer/source/texture/texture.cxx
index e1f8f92a3a5a..89953e624395 100644
--- a/drawinglayer/source/texture/texture.cxx
+++ b/drawinglayer/source/texture/texture.cxx
@@ -18,12 +18,11 @@
*/
#include <drawinglayer/texture/texture.hxx>
+#include <drawinglayer/tools/converters.hxx>
#include <basegfx/numeric/ftools.hxx>
#include <basegfx/tools/gradienttools.hxx>
#include <basegfx/matrix/b2dhommatrixtools.hxx>
-
-
namespace drawinglayer
{
namespace texture
@@ -45,9 +44,9 @@ namespace drawinglayer
void GeoTexSvx::modifyBColor(const basegfx::B2DPoint& /*rUV*/, basegfx::BColor& rBColor, double& /*rfOpacity*/) const
{
// base implementation creates random color (for testing only, may also be pure virtual)
- rBColor.setRed((rand() & 0x7fff) / 32767.0);
- rBColor.setGreen((rand() & 0x7fff) / 32767.0);
- rBColor.setBlue((rand() & 0x7fff) / 32767.0);
+ rBColor.setRed(tools::getRandomColorRange());
+ rBColor.setGreen(tools::getRandomColorRange());
+ rBColor.setBlue(tools::getRandomColorRange());
}
void GeoTexSvx::modifyOpacity(const basegfx::B2DPoint& rUV, double& rfOpacity) const
diff --git a/include/comphelper/random.hxx b/include/comphelper/random.hxx
index 6b5d6eb86377..e7051a860403 100644
--- a/include/comphelper/random.hxx
+++ b/include/comphelper/random.hxx
@@ -18,11 +18,24 @@ namespace comphelper
namespace rng
{
-/// set initial seed (equivalent of libc srand())
-COMPHELPER_DLLPUBLIC void seed(int i);
+/// reset initial seed, typically you don't call this as the initial seed is taken from the
+// time on the first use of the distribution functions
+COMPHELPER_DLLPUBLIC void reseed(int i);
-/// uniform distribution in [0,1)
-COMPHELPER_DLLPUBLIC double uniform();
+// note that uniform_int_distribution is inclusive of b, i.e. [a,b] while
+// uniform_real_distribution is exclusive of b, i.e. [a,b), [std/boost]::nextafter may be your friend there
+
+/// uniform distribution in [a,b)
+COMPHELPER_DLLPUBLIC double uniform_real_distribution(double a = 0.0, double b = 1.0);
+
+/// uniform distribution in [a,b]
+COMPHELPER_DLLPUBLIC int uniform_int_distribution(int a, int b);
+
+/// uniform distribution in [a,b]
+COMPHELPER_DLLPUBLIC unsigned int uniform_int_distribution(unsigned int a, unsigned int b);
+
+/// uniform distribution in [a,b]
+COMPHELPER_DLLPUBLIC size_t uniform_int_distribution(size_t a, size_t b);
} // namespace
diff --git a/include/drawinglayer/tools/converters.hxx b/include/drawinglayer/tools/converters.hxx
index 957973f8bda1..c004e25a7a3c 100644
--- a/include/drawinglayer/tools/converters.hxx
+++ b/include/drawinglayer/tools/converters.hxx
@@ -37,6 +37,8 @@ namespace drawinglayer
sal_uInt32 nDiscreteHeight,
sal_uInt32 nMaxQuadratPixels);
+ double DRAWINGLAYER_DLLPUBLIC getRandomColorRange();
+
} // end of namespace tools
} // end of namespace drawinglayer
diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx
index 46290053755c..65912381ff61 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -83,6 +83,7 @@
#include <com/sun/star/container/XNamed.hpp>
#include <comphelper/processfactory.hxx>
+#include <comphelper/random.hxx>
#include <xmloff/SchXMLSeriesHelper.hxx>
#include "ColorPropertySet.hxx"
#include <set>
@@ -431,8 +432,7 @@ sal_Int32 lcl_getChartType( const OUString& sChartType )
sal_Int32 lcl_generateRandomValue()
{
- static sal_Int32 MAX_NUMBER = 100000000;
- return sal_Int32( rand() % MAX_NUMBER );
+ return comphelper::rng::uniform_int_distribution(0, 100000000-1);
}
ChartExport::ChartExport( sal_Int32 nXmlNamespace, FSHelperPtr pFS, Reference< frame::XModel >& xModel, XmlFilterBase* pFB, DocumentType eDocumentType )
diff --git a/sc/Library_scopencl.mk b/sc/Library_scopencl.mk
index 3e6b955638ca..5f60a3736a26 100644
--- a/sc/Library_scopencl.mk
+++ b/sc/Library_scopencl.mk
@@ -24,6 +24,7 @@ $(eval $(call gb_Library_use_externals,scopencl,\
))
$(eval $(call gb_Library_use_libraries,scopencl,\
+ comphelper \
cppu \
cppuhelper \
for \
diff --git a/sc/source/core/data/global.cxx b/sc/source/core/data/global.cxx
index 9b4e63e6f26a..ae9e84c299b4 100644
--- a/sc/source/core/data/global.cxx
+++ b/sc/source/core/data/global.cxx
@@ -521,8 +521,6 @@ void ScGlobal::Init()
// arguments are to be merged in, which in turn need strings of function
// names from the compiler.
ScParameterClassification::Init();
- srand( (unsigned) time( NULL ) ); // Random Seed Init for Interpreter
- ::comphelper::rng::seed( time( NULL ) ); // seed for libc rand() replacement
InitAddIns();
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 7d5d79f2eac7..e41458b9e9d7 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -18,6 +18,7 @@
*/
#include <rtl/math.hxx>
+#include <comphelper/random.hxx>
#include <unotools/textsearch.hxx>
#include <svl/zforlist.hxx>
#include <svl/zformat.hxx>
@@ -1287,10 +1288,10 @@ bool ScTable::IsSorted( SCCOLROW nStart, SCCOLROW nEnd ) const // ueber aSortP
void ScTable::DecoladeRow( ScSortInfoArray* pArray, SCROW nRow1, SCROW nRow2 )
{
SCROW nRow;
- SCROW nMax = nRow2 - nRow1;
+ int nMax = nRow2 - nRow1;
for (SCROW i = nRow1; (i + 4) <= nRow2; i += 4)
{
- nRow = rand() % nMax;
+ nRow = comphelper::rng::uniform_int_distribution(0, nMax-1);
pArray->Swap(i, nRow1 + nRow);
}
}
diff --git a/sc/source/core/opencl/opencl_device.cxx b/sc/source/core/opencl/opencl_device.cxx
index 0dec2673ffb7..6b99758dacc3 100644
--- a/sc/source/core/opencl/opencl_device.cxx
+++ b/sc/source/core/opencl/opencl_device.cxx
@@ -20,6 +20,7 @@
#include <iostream>
#include <sstream>
#include <vector>
+#include <comphelper/random.hxx>
#include <boost/scoped_ptr.hpp>
#include "opencl_device.hxx"
@@ -170,13 +171,12 @@ double timerCurrent(timer* mytimer)
/* Random number generator */
double random(double min, double max)
{
- return floor(((double)rand() / ((unsigned int)RAND_MAX + 1)) * (max - min + 1) + min);
+ return comphelper::rng::uniform_real_distribution(min, max);
}
/* Populate input */
void populateInput(LibreOfficeDeviceEvaluationIO* testData)
{
- srand((unsigned int)time(NULL));
double* input0 = &testData->input0[0];
double* input1 = &testData->input1[0];
double* input2 = &testData->input2[0];
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 7c7dff39d349..358dab006806 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -1662,7 +1662,7 @@ void ScInterpreter::ScPi()
void ScInterpreter::ScRandom()
{
- PushDouble(::comphelper::rng::uniform());
+ PushDouble(::comphelper::rng::uniform_real_distribution());
}
void ScInterpreter::ScTrue()
diff --git a/sc/source/core/tool/interpr3.cxx b/sc/source/core/tool/interpr3.cxx
index 685e3724a8b0..7b97d598ff2b 100644
--- a/sc/source/core/tool/interpr3.cxx
+++ b/sc/source/core/tool/interpr3.cxx
@@ -34,6 +34,7 @@
#include <vector>
#include <algorithm>
#include <boost/math/special_functions/log1p.hpp>
+#include <comphelper/random.hxx>
using ::std::vector;
using namespace formula;
@@ -3819,7 +3820,7 @@ void ScInterpreter::QuickSort( vector<double>& rSortArray, vector<long>* pIndexO
size_t nValCount = rSortArray.size();
for (size_t i = 0; (i + 4) <= nValCount-1; i += 4)
{
- size_t nInd = rand() % (int) (nValCount-1);
+ size_t nInd = comphelper::rng::uniform_int_distribution(static_cast<size_t>(0), nValCount-2);
::std::swap( rSortArray[i], rSortArray[nInd]);
if (pIndexOrder)
::std::swap( pIndexOrder->at(i), pIndexOrder->at(nInd));
diff --git a/sc/source/ui/StatisticsDialogs/SamplingDialog.cxx b/sc/source/ui/StatisticsDialogs/SamplingDialog.cxx
index 49b2d4315577..a88faafd1f64 100644
--- a/sc/source/ui/StatisticsDialogs/SamplingDialog.cxx
+++ b/sc/source/ui/StatisticsDialogs/SamplingDialog.cxx
@@ -11,7 +11,7 @@
#include <sfx2/dispatch.hxx>
#include <svl/zforlist.hxx>
#include <svl/undo.hxx>
-
+#include <comphelper/random.hxx>
#include "rangelst.hxx"
#include "scitems.hxx"
#include "docsh.hxx"
@@ -22,8 +22,6 @@
#include "docfunc.hxx"
#include "StatisticsDialogs.hrc"
-#include <boost/random.hpp>
-
#include "SamplingDialog.hxx"
ScSamplingDialog::ScSamplingDialog(
@@ -203,11 +201,6 @@ ScRange ScSamplingDialog::PerformRandomSampling(ScDocShell* pDocShell)
SCCOL outCol = mOutputAddress.Col();
SCROW outRow = mOutputAddress.Row();
- TimeValue now;
- osl_getSystemTime(&now);
- boost::mt19937 seed(now.Nanosec);
- boost::uniform_01<boost::mt19937> rng(seed);
-
SCROW inRow;
sal_Int64 aSampleSize = mpSampleSize->GetValue();
@@ -222,11 +215,9 @@ ScRange ScSamplingDialog::PerformRandomSampling(ScDocShell* pDocShell)
outRow = mOutputAddress.Row();
inRow = aStart.Row();
- double aRandomValue;
-
while ((outRow - mOutputAddress.Row()) < aSampleSize)
{
- aRandomValue = rng();
+ double aRandomValue = comphelper::rng::uniform_real_distribution();
if ( (aPopulationSize - (inRow - aStart.Row())) * aRandomValue >= aSampleSize - (outRow - mOutputAddress.Row()) )
{
diff --git a/scaddins/idl/com/sun/star/sheet/addin/XAnalysis.idl b/scaddins/idl/com/sun/star/sheet/addin/XAnalysis.idl
index e349284e97a2..4622f2acefb6 100644
--- a/scaddins/idl/com/sun/star/sheet/addin/XAnalysis.idl
+++ b/scaddins/idl/com/sun/star/sheet/addin/XAnalysis.idl
@@ -109,6 +109,8 @@ module addin
raises( com::sun::star::lang::IllegalArgumentException );
// randbetween.
+ // Min is the smallest value randbetween will return
+ // Max is the largest value randbetween will return
double getRandbetween( [in] double Min, [in] double Max )
raises( com::sun::star::lang::IllegalArgumentException );
diff --git a/scaddins/source/analysis/analysis.cxx b/scaddins/source/analysis/analysis.cxx
index 6349b7b27247..d1751f4fac40 100644
--- a/scaddins/source/analysis/analysis.cxx
+++ b/scaddins/source/analysis/analysis.cxx
@@ -22,6 +22,7 @@
#include "bessel.hxx"
#include <cppuhelper/factory.hxx>
#include <comphelper/processfactory.hxx>
+#include <comphelper/random.hxx>
#include <cppuhelper/supportsservice.hxx>
#include <osl/diagnose.h>
#include <rtl/ustrbuf.hxx>
@@ -30,6 +31,7 @@
#include <string.h>
#include <tools/resmgr.hxx>
#include <tools/rcid.h>
+#include <boost/math/special_functions/next.hpp>
#define ADDIN_SERVICE "com.sun.star.sheet.AddIn"
#define MY_SERVICE "com.sun.star.sheet.addin.Analysis"
@@ -700,12 +702,7 @@ double SAL_CALL AnalysisAddIn::getRandbetween( double fMin, double fMax ) throw(
if( fMin > fMax )
throw lang::IllegalArgumentException();
- // fMax -> range
- double fRet = fMax - fMin + 1.0;
- fRet *= rand();
- fRet /= (RAND_MAX + 1.0);
- fRet += fMin;
- fRet = floor( fRet ); // simple floor is sufficient here
+ double fRet = comphelper::rng::uniform_real_distribution(fMin, boost::math::nextafter(fMax, DBL_MAX));
RETURN_FINITE( fRet );
}
diff --git a/sd/source/core/CustomAnimationPreset.cxx b/sd/source/core/CustomAnimationPreset.cxx
index b070733c6f30..09ba6a5e5820 100644
--- a/sd/source/core/CustomAnimationPreset.cxx
+++ b/sd/source/core/CustomAnimationPreset.cxx
@@ -30,6 +30,7 @@
#include <com/sun/star/beans/NamedValue.hpp>
#include <unotools/streamwrap.hxx>
#include <comphelper/processfactory.hxx>
+#include <comphelper/random.hxx>
#include <comphelper/string.hxx>
#include <unotools/pathoptions.hxx>
#include <tools/stream.hxx>
@@ -576,12 +577,12 @@ Reference< XAnimationNode > CustomAnimationPresets::getRandomPreset( sal_Int16 n
if( pCategoryList && pCategoryList->size() )
{
- sal_Int32 nCategory = (rand() * pCategoryList->size() / RAND_MAX);
+ sal_Int32 nCategory = comphelper::rng::uniform_int_distribution(static_cast<size_t>(0), pCategoryList->size()-1);
PresetCategoryPtr pCategory = (*pCategoryList)[nCategory];
if( pCategory.get() && !pCategory->maEffects.empty() )
{
- sal_Int32 nDescriptor = (rand() * pCategory->maEffects.size() / RAND_MAX);
+ sal_Int32 nDescriptor = comphelper::rng::uniform_int_distribution(static_cast<size_t>(0), pCategory->maEffects.size()-1);
CustomAnimationPresetPtr pPreset = pCategory->maEffects[nDescriptor];
if( pPreset.get() )
{
@@ -590,7 +591,7 @@ Reference< XAnimationNode > CustomAnimationPresets::getRandomPreset( sal_Int16 n
OUString aSubType;
if( !aSubTypes.empty() )
{
- sal_Int32 nSubType = (rand() * aSubTypes.size() / RAND_MAX);
+ size_t nSubType = comphelper::rng::uniform_int_distribution(static_cast<size_t>(0), aSubTypes.size()-1);
aSubType = aSubTypes[nSubType];
}
xNode = pPreset->create( aSubType );
diff --git a/sd/source/ui/remotecontrol/AvahiNetworkService.cxx b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx
index ad2bfef61aff..9f53c5d5c16c 100644
--- a/sd/source/ui/remotecontrol/AvahiNetworkService.cxx
+++ b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx
@@ -20,7 +20,7 @@
#include <avahi-common/error.h>
#include <avahi-common/timeval.h>
#include <avahi-common/thread-watch.h>
-
+#include <comphelper/random.hxx>
#include <dbus/dbus.h>
#include <sal/log.hxx>
@@ -99,7 +99,8 @@ static bool create_services(AvahiClient *c) {
if (avahi_entry_group_is_empty(group)) {
SAL_INFO("sdremote.wifi", "Adding service '" << avahiService->getName() << "'");
char r[128];
- snprintf(r, sizeof(r), "random=%i", rand());
+ int nRandom = comphelper::rng::uniform_int_distribution(0, std::numeric_limits<int>::max());
+ snprintf(r, sizeof(r), "random=%i", nRandom);
int ret = avahi_entry_group_add_service(
group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, static_cast<AvahiPublishFlags>(0),
avahiService->getName().c_str(), kREG_TYPE, NULL, NULL, 1599, "local", r, NULL
diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
index 86d11bf58c9b..ce78ab0c40ec 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
@@ -32,6 +32,8 @@
#include <utility>
#include <boost/make_shared.hpp>
+#include <boost/math/special_functions/next.hpp>
+#include <comphelper/random.hxx>
#include "OGLTrans_TransitionImpl.hxx"
#include <math.h>
@@ -674,7 +676,7 @@ boost::shared_ptr<OGLTransitionImpl> makeRochade()
inline double randFromNeg1to1()
{
- return ( ( static_cast<double>( rand() ) / static_cast<double>( RAND_MAX ) ) * 2.0 ) - 1.0;
+ return comphelper::rng::uniform_real_distribution(-1.0, boost::math::nextafter(1.0, DBL_MAX));
}
// TODO(Q3): extract to basegfx
diff --git a/slideshow/source/inc/tools.hxx b/slideshow/source/inc/tools.hxx
index 4e8037e3f3d3..682530f3bbc0 100644
--- a/slideshow/source/inc/tools.hxx
+++ b/slideshow/source/inc/tools.hxx
@@ -26,7 +26,7 @@
#include <com/sun/star/animations/XAnimationNode.hpp>
#include <com/sun/star/container/XEnumerationAccess.hpp>
#include <com/sun/star/container/XEnumeration.hpp>
-
+#include <comphelper/random.hxx>
#include <vector>
#include <cppcanvas/color.hxx>
@@ -293,8 +293,7 @@ namespace slideshow
/// Gets a random ordinal [0,n)
inline ::std::size_t getRandomOrdinal( const ::std::size_t n )
{
- return static_cast< ::std::size_t >(
- double(n) * rand() / (RAND_MAX + 1.0) );
+ return comphelper::rng::uniform_int_distribution(static_cast<size_t>(0), n-1);
}
/// To work around ternary operator in initializer lists
diff --git a/svx/source/svdraw/sdrpagewindow.cxx b/svx/source/svdraw/sdrpagewindow.cxx
index f4cccca0797a..bdd163d3c08c 100644
--- a/svx/source/svdraw/sdrpagewindow.cxx
+++ b/svx/source/svdraw/sdrpagewindow.cxx
@@ -23,6 +23,7 @@
#include <com/sun/star/awt/PosSize.hpp>
#include <com/sun/star/util/XModeChangeBroadcaster.hpp>
#include <comphelper/processfactory.hxx>
+#include <comphelper/random.hxx>
#include <vcl/svapp.hxx>
#include <toolkit/helper/vclunohelper.hxx>
#include <svx/svdouno.hxx>
@@ -254,7 +255,10 @@ namespace
for(sal_uInt32 a(0L); a < aResult.count(); a++)
{
- Color aColor(rand()%255, rand()%255, rand()%255);
+ int nR = comphelper::rng::uniform_int_distribution(0, 254);
+ int nG = comphelper::rng::uniform_int_distribution(0, 254);
+ int nB = comphelper::rng::uniform_int_distribution(0, 254);
+ Color aColor(nR, nG, nB);
impPaintStrokePolygon(aResult.getB2DPolygon(a), rOutDev, aColor);
}
}
diff --git a/svx/source/svdraw/sdrpaintwindow.cxx b/svx/source/svdraw/sdrpaintwindow.cxx
index f64aea30c499..ae6f6d58dd28 100644
--- a/svx/source/svdraw/sdrpaintwindow.cxx
+++ b/svx/source/svdraw/sdrpaintwindow.cxx
@@ -17,6 +17,7 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
+#include <comphelper/random.hxx>
#include <svx/sdrpaintwindow.hxx>
#include <sdr/overlay/overlaymanagerbuffered.hxx>
#include <svx/svdpntv.hxx>
@@ -174,7 +175,10 @@ void SdrPreRenderDevice::OutputPreRenderDevice(const vcl::Region& rExpandedRegio
if(bDoPaintForVisualControlRegion)
{
- const Color aColor((((((rand()&0x7f)|0x80)<<8L)|((rand()&0x7f)|0x80))<<8L)|((rand()&0x7f)|0x80));
+ int nR = comphelper::rng::uniform_int_distribution(0, 0x7F-1);
+ int nG = comphelper::rng::uniform_int_distribution(0, 0x7F-1);
+ int nB = comphelper::rng::uniform_int_distribution(0, 0x7F-1);
+ const Color aColor(((((nR|0x80)<<8L)|(nG|0x80))<<8L)|(nB|0x80));
mrOutputDevice.SetLineColor(aColor);
mrOutputDevice.SetFillColor();
@@ -183,32 +187,6 @@ void SdrPreRenderDevice::OutputPreRenderDevice(const vcl::Region& rExpandedRegio
#endif
}
-// while(aRegionPixel.GetEnumRects(aRegionHandle, aRegionRectanglePixel))
-// {
-// // for each rectangle, copy the area
-// const Point aTopLeft(aRegionRectanglePixel.TopLeft());
-// const Size aSize(aRegionRectanglePixel.GetSize());
-
-// mrOutputDevice.DrawOutDev(
-// aTopLeft, aSize,
-// aTopLeft, aSize,
-// maPreRenderDevice);
-
-//#ifdef DBG_UTIL
-// // #i74769#
-// static bool bDoPaintForVisualControlRegion(false);
-// if(bDoPaintForVisualControlRegion)
-// {
-// Color aColor((((((rand()&0x7f)|0x80)<<8L)|((rand()&0x7f)|0x80))<<8L)|((rand()&0x7f)|0x80));
-// mrOutputDevice.SetLineColor(aColor);
-// mrOutputDevice.SetFillColor();
-// mrOutputDevice.DrawRect(aRegionRectanglePixel);
-// }
-//#endif
-// }
-
-// aRegionPixel.EndEnumRects(aRegionHandle);
-
mrOutputDevice.EnableMapMode(bMapModeWasEnabledDest);
maPreRenderDevice.EnableMapMode(bMapModeWasEnabledSource);
}
diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx
index ec62c05366ee..a739ca0c0e96 100644
--- a/sw/qa/core/uwriter.cxx
+++ b/sw/qa/core/uwriter.cxx
@@ -16,6 +16,7 @@
#include <com/sun/star/i18n/TransliterationModulesExtra.hpp>
#include <comphelper/processfactory.hxx>
+#include <comphelper/random.hxx>
#include <tools/urlobj.hxx>
#include <unotools/tempfile.hxx>
#include <unotools/transliterationwrapper.hxx>
@@ -849,7 +850,7 @@ getRand(int modulus)
{
if (modulus <= 0)
return 0;
- return rand() % modulus;
+ return comphelper::rng::uniform_int_distribution(0, modulus-1);
}
static OUString
@@ -869,12 +870,13 @@ static SwPosition
getRandomPosition(SwDoc *pDoc, int /* nOffset */)
{
const SwPosition aPos(pDoc->GetNodes().GetEndOfContent());
- sal_uLong nNodes = aPos.nNode.GetNode().GetIndex() - aPos.nNode.GetNode().StartOfSectionIndex();
- sal_uLong n = (rand() * nNodes) / RAND_MAX;
- SwPaM pam(aPos);
- for (sal_uLong i = 0; i < n; ++i) {
- pam.Move(fnMoveBackward, fnGoNode);
- }
+ sal_uLong nNodes = aPos.nNode.GetNode().GetIndex() - aPos.nNode.GetNode().StartOfSectionIndex();
+ sal_uLong n = comphelper::rng::uniform_int_distribution(static_cast<sal_uLong>(0), nNodes);
+ SwPaM pam(aPos);
+ for (sal_uLong i = 0; i < n; ++i)
+ {
+ pam.Move(fnMoveBackward, fnGoNode);
+ }
return *pam.GetPoint();
}
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 36b1f303b149..95b0ea42af9b 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -40,6 +40,7 @@
#include "wrtww8.hxx"
+#include <comphelper/random.hxx>
#include <comphelper/string.hxx>
#include <comphelper/flagguard.hxx>
#include <oox/token/tokens.hxx>
@@ -657,9 +658,9 @@ void DocxAttributeOutput::WriteSdtBlock( sal_Int32& nSdtPrToken,
if( nSdtPrToken == FSNS( XML_w, XML_id ) || ( bPara && m_bParagraphSdtHasId ) )
//Word won't open a document with an empty id tag, we fill it with a random number
- m_pSerializer->singleElementNS(XML_w, XML_id,
- FSNS(XML_w, XML_val), OString::number( rand() ),
- FSEND );
+ m_pSerializer->singleElementNS(XML_w, XML_id, FSNS(XML_w, XML_val),
+ OString::number(comphelper::rng::uniform_int_distribution(0, std::numeric_limits<int>::max())),
+ FSEND);
if(( pSdtPrDataBindingAttrs ) && !m_rExport.SdrExporter().IsParagraphHasDrawing())
{
@@ -4794,7 +4795,7 @@ void DocxAttributeOutput::WriteOLE( SwOLENode& rNode, const Size& rSize, const S
XML_ProgID, OUStringToOString( sProgID, RTL_TEXTENCODING_UTF8 ).getStr(),
XML_ShapeID, sShapeId.getStr(),
XML_DrawAspect, OUStringToOString( sDrawAspect, RTL_TEXTENCODING_UTF8 ).getStr(),
- XML_ObjectID, "_" + OString::number( rand() ),
+ XML_ObjectID, "_" + OString::number(comphelper::rng::uniform_int_distribution(0, std::numeric_limits<int>::max())),
FSNS( XML_r, XML_id ), sId.getStr(),
FSEND );
diff --git a/vbahelper/source/vbahelper/vbacommandbarhelper.cxx b/vbahelper/source/vbahelper/vbacommandbarhelper.cxx
index 0c35ebc5018f..f162e5cbd088 100644
--- a/vbahelper/source/vbahelper/vbacommandbarhelper.cxx
+++ b/vbahelper/source/vbahelper/vbacommandbarhelper.cxx
@@ -26,6 +26,7 @@
#include <com/sun/star/ui/UIElementType.hpp>
#include <com/sun/star/ui/theWindowStateConfiguration.hpp>
#include <comphelper/processfactory.hxx>
+#include <comphelper/random.hxx>
#include <vbahelper/vbahelper.hxx>
#include <rtl/ustrbuf.hxx>
#include <time.h>
@@ -262,8 +263,7 @@ OUString VbaCommandBarHelper::generateCustomURL()
url += CUSTOM_TOOLBAR_STR;
// use a random number to minimize possible clash with existing custom toolbars
- srand( unsigned( time( NULL ) ));
- url += OUString::number( rand(), 16 );
+ url += OUString::number(comphelper::rng::uniform_int_distribution(0, std::numeric_limits<int>::max()), 16);
return url;
}
diff --git a/vcl/source/window/debugevent.cxx b/vcl/source/window/debugevent.cxx
index cc4a86552448..b2b755303763 100644
--- a/vcl/source/window/debugevent.cxx
+++ b/vcl/source/window/debugevent.cxx
@@ -7,6 +7,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
+#include <comphelper/random.hxx>
#include <rtl/math.hxx>
#include <rtl/string.hxx>
#include <tools/time.hxx>
@@ -29,7 +30,7 @@ DebugEventInjector::DebugEventInjector( sal_uInt32 nMaxEvents) :
static double getRandom()
{
- return (double)rand() / RAND_MAX;
+ return comphelper::rng::uniform_real_distribution();
}
vcl::Window *DebugEventInjector::ChooseWindow()
diff --git a/xmloff/source/text/txtlists.cxx b/xmloff/source/text/txtlists.cxx
index 79a132589020..52265c81df39 100644
--- a/xmloff/source/text/txtlists.cxx
+++ b/xmloff/source/text/txtlists.cxx
@@ -19,7 +19,7 @@
#include <txtlists.hxx>
-
+#include <comphelper/random.hxx>
#include <tools/debug.hxx>
#include <tools/date.hxx>
#include <tools/time.hxx>
@@ -233,7 +233,7 @@ OUString XMLTextListsHelper::GenerateNewListId() const
// Value of xml:id in element <text:list> has to be a valid ID type (#i92478#)
sal_Int64 n = ::tools::Time( ::tools::Time::SYSTEM ).GetTime();
n += Date( Date::SYSTEM ).GetDate();
- n += rand();
+ n += comphelper::rng::uniform_int_distribution(0, std::numeric_limits<int>::max());
// Value of xml:id in element <text:list> has to be a valid ID type (#i92478#)
sTmpStr += OUString::number( n );
}