int MeasureCalc::GetRandom() { int value = 0; if (m_LowBound == m_HighBound) { value = m_LowBound; } else if (m_UniqueRandom) { if (m_UniqueNumbers.empty()) { UpdateUniqueNumberList(); } value = m_UniqueNumbers.back(); m_UniqueNumbers.pop_back(); } else { std::uniform_int_distribution<int>::param_type params(m_LowBound, m_HighBound); m_Distrubtion.param(params); m_Distrubtion.reset(); value = m_Distrubtion(m_Engine); } return value; }
/* ** Read the options specified in the ini file. ** */ void MeasureCalc::ReadOptions(ConfigParser& parser, const WCHAR* section) { Measure::ReadOptions(parser, section); // Store the current values so we know if the value needs to be updated int oldLowBound = m_LowBound; int oldHighBound = m_HighBound; bool oldUpdateRandom = m_UpdateRandom; bool oldUniqueRandom = m_UniqueRandom; std::wstring oldFormula = m_Formula; m_Formula = parser.ReadString(section, L"Formula", L""); m_LowBound = parser.ReadInt(section, L"LowBound", DEFAULT_LOWER_BOUND); m_HighBound = parser.ReadInt(section, L"HighBound", DEFAULT_UPPER_BOUND); m_UpdateRandom = parser.ReadBool(section, L"UpdateRandom", false); m_UniqueRandom = parser.ReadBool(section, L"UniqueRandom", false); if (!m_UniqueRandom) { m_UniqueNumbers.clear(); } if (!m_Initialized || wcscmp(m_Formula.c_str(), oldFormula.c_str()) != 0 || oldLowBound != m_LowBound || oldHighBound != m_HighBound || oldUpdateRandom != m_UpdateRandom || oldUniqueRandom != m_UniqueRandom) { // Reset bounds if |m_LowBound| is greater than |m_HighBound| if (m_LowBound > m_HighBound) { LogErrorF(this, L"\"LowBound\" (%i) must be less then or equal to \"HighBound\" (%i)", m_LowBound, m_HighBound); m_HighBound = m_LowBound; } // Reset the list if the bounds are changed if (m_UniqueRandom && ( oldLowBound != m_LowBound || oldHighBound != m_HighBound)) { UpdateUniqueNumberList(); } if (!m_UpdateRandom) { FormulaReplace(); } const WCHAR* errMsg = MathParser::Check(m_Formula.c_str()); if (errMsg != nullptr) { LogErrorF(this, L"Calc: %s", errMsg); m_Formula.clear(); } } }
int MeasureCalc::GetRandom() { if (m_LowBound == m_HighBound || m_LowBound > m_HighBound) { return m_LowBound; } else if (m_UniqueRandom) { if (m_UniqueNumbers.empty()) { UpdateUniqueNumberList(); } const int value = m_UniqueNumbers.back(); m_UniqueNumbers.pop_back(); return value; } else { const std::uniform_int_distribution<int> distribution(m_LowBound, m_HighBound); return distribution(GetRandomEngine()); } }