123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /*
- * File: Random.cpp
- * Project: DUtils library
- * Author: Dorian Galvez-Lopez
- * Date: April 2010
- * Description: manages pseudo-random numbers
- * License: see the LICENSE.txt file
- *
- */
- #include "Random.h"
- #include "Timestamp.h"
- #include <cstdlib>
- using namespace std;
- bool DUtils::Random::m_already_seeded = false;
- void DUtils::Random::SeedRand(){
- Timestamp time;
- time.setToCurrentTime();
- srand((unsigned)time.getFloatTime());
- }
- void DUtils::Random::SeedRandOnce()
- {
- if(!m_already_seeded)
- {
- DUtils::Random::SeedRand();
- m_already_seeded = true;
- }
- }
- void DUtils::Random::SeedRand(int seed)
- {
- srand(seed);
- }
- void DUtils::Random::SeedRandOnce(int seed)
- {
- if(!m_already_seeded)
- {
- DUtils::Random::SeedRand(seed);
- m_already_seeded = true;
- }
- }
- int DUtils::Random::RandomInt(int min, int max){
- int d = max - min + 1;
- return int(((double)rand()/((double)RAND_MAX + 1.0)) * d) + min;
- }
- // ---------------------------------------------------------------------------
- // ---------------------------------------------------------------------------
- DUtils::Random::UnrepeatedRandomizer::UnrepeatedRandomizer(int min, int max)
- {
- if(min <= max)
- {
- m_min = min;
- m_max = max;
- }
- else
- {
- m_min = max;
- m_max = min;
- }
- createValues();
- }
- // ---------------------------------------------------------------------------
- DUtils::Random::UnrepeatedRandomizer::UnrepeatedRandomizer
- (const DUtils::Random::UnrepeatedRandomizer& rnd)
- {
- *this = rnd;
- }
- // ---------------------------------------------------------------------------
- int DUtils::Random::UnrepeatedRandomizer::get()
- {
- if(empty()) createValues();
-
- DUtils::Random::SeedRandOnce();
-
- int k = DUtils::Random::RandomInt(0, m_values.size()-1);
- int ret = m_values[k];
- m_values[k] = m_values.back();
- m_values.pop_back();
-
- return ret;
- }
- // ---------------------------------------------------------------------------
- void DUtils::Random::UnrepeatedRandomizer::createValues()
- {
- int n = m_max - m_min + 1;
-
- m_values.resize(n);
- for(int i = 0; i < n; ++i) m_values[i] = m_min + i;
- }
- // ---------------------------------------------------------------------------
- void DUtils::Random::UnrepeatedRandomizer::reset()
- {
- if((int)m_values.size() != m_max - m_min + 1) createValues();
- }
- // ---------------------------------------------------------------------------
- DUtils::Random::UnrepeatedRandomizer&
- DUtils::Random::UnrepeatedRandomizer::operator=
- (const DUtils::Random::UnrepeatedRandomizer& rnd)
- {
- if(this != &rnd)
- {
- this->m_min = rnd.m_min;
- this->m_max = rnd.m_max;
- this->m_values = rnd.m_values;
- }
- return *this;
- }
- // ---------------------------------------------------------------------------
|