refs #452, allow to pick random elements from collection

(will be used in view resizing)
This commit is contained in:
Klaus Basan
2015-09-23 15:17:44 +02:00
committed by Mathew Sutcliffe
parent 5718abe03c
commit ad1938b8d8
3 changed files with 40 additions and 1 deletions

View File

@@ -337,6 +337,23 @@ namespace BlackMisc
*/
void remove(const CCollection &other) { *this = CCollection(*this).difference(other); }
/*!
* \brief Return some random elements from container
* \param elements how many elements
*/
CCollection randomElements(int elements) const
{
if (this->isEmpty() || elements < 1) { return CCollection(); }
int high = this->size();
CCollection r;
for (int i = 0; i < elements; i++)
{
int randomIndex = qrand() % high;
r.push_back(*(this->begin()+ randomIndex));
}
return r;
}
/*!
* \brief Test for equality.
* \todo Improve inefficient implementation.

View File

@@ -98,6 +98,12 @@ namespace BlackMisc
//! Normalize: 0≤ degrees <360
static double normalizeDegrees(double degrees);
//! Random number between low and high
static int randomIntger(int low, int high)
{
return qrand() % ((high + 1) - low) + low;
}
};
} // namespace

View File

@@ -20,7 +20,6 @@
#include <iterator>
#include <utility>
#include <initializer_list>
#include <QtConcurrent/QtConcurrent>
namespace BlackMisc
{
@@ -519,6 +518,23 @@ namespace BlackMisc
return sorted(BlackMisc::Predicates::MemberLess(key1, keys...));
}
/*!
* \brief Return some random elements from container
* \param elements how many elements
*/
CSequence randomElements(int elements) const
{
if (this->isEmpty() || elements < 1) { return CSequence(); }
int high = this->size();
CSequence r;
for (int i = 0; i < elements; i++)
{
int randomIndex = qrand() % high;
r.push_back(this->operator [](randomIndex));
}
return r;
}
//! Equals operator.
friend bool operator ==(const CSequence &a, const CSequence &b)
{