Random Number generation missing a pattern for the same seed
我正在为一个特定的种子生成一个随机数…所以我有一个名为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ::setSeed( unsigned & seed ) { m_seed = seed } ::reset() { m_seed = getcurrentseed() srand(m_seed); } ::trigger() { raValue = minValue + ( rand() % (maxValue-minValue+1) ); } |
对于一个特定的种子,如果我生成5个随机值5次,有时我会看到其中一个集合中缺少一个值。原因可能是什么?
例如。
1 2 3 4 5 6 7 8 | seed(5) rand() rand() rand() seed(5) rand() rand() rand() |
号
在第二个seed(5)调用之后,有时我会得到一个不同的数字序列,或者我错过了前一个序列中的一个数字。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | void RandomNodeLogic::process( SingleInputValueGetters const& singleInputValueGetters , MultiInputValueGetters const& /*multiInputValueGetters*/ , OutputValueKeepers const& /*outputValueKeepers */ , OutputValueSetters const& outputValueSetters ) { // get the seed and generate the random number bool doRandom( false ); int maxValue= getMaxValue().getAs<int>(); int minValue = getMinValue().getAs<int>(); int newValue=0; if(minValue > maxValue) { setMaxValue(minValue); setMinValue(maxValue); maxValue= getMaxValue().getAs<int>(); minValue = getMinValue().getAs<int>(); } SingleInputValueGetters::const_iterator it = singleInputValueGetters.begin(); for( ; it != singleInputValueGetters.end(); ++it) { SlotID id = it->first; const SlotValue* value = it->second(); if(!value) { continue; } if ( id == RTT::LogicNetwork::RandomNode::nextValuesSlotID ) { doRandom = value->getAs<bool>(); newValue = minValue + ( rand() % (maxValue-minValue+1) ); // read the value from the next input slot setRandomValue( ::convertToSlotValue( m_genValue.m_attrType, newValue ) ); } else if ( id == RTT::LogicNetwork::RandomNode::resetValuesSlotID ) { if ( value->getAs<bool>() ) { doRandom = value->getAs<bool>(); setSeed(m_seed); newValue = minValue + ( rand() % (maxValue-minValue+1) ); setRandomValue( ::convertToSlotValue( m_genValue.m_attrType, newValue ) ); } } } if(!m_genValue.empty() && doRandom) { outputValueSetters.find( RTT::LogicNetwork::RandomNode::outputValuesSlotID)->second( m_genValue.getAs<int>() ) ; RTT_LOG_INFO( QString("Random Number: %1").arg( m_genValue.getAs<int>() )); } if(!doRandom) { if(m_genValue.empty()) { srand(1); m_genValue = 0; } getAssociatedNode()->sleep(); } } void RandomNodeLogic::setSeed( const SlotValue& seed ) { SlotValue oldValue = m_seed; m_seed = seed; srand(m_seed.getAs<unsigned int>()); modifiablePropertyValueChanged( RTT::LogicNetwork::RandomNode::seedPropertyID, m_seed, oldValue ); } |
到目前为止您所提供的所有信息都告诉我,您正在尝试为C随机函数编写C++类包装器。即使这个包装器是一个可以多次实例化的类,底层C函数也只能访问一个状态。这就是为什么您必须确保没有其他人使用这个包装类的实例。
这就是为什么用C++类来封装C的随机函数是个坏主意。作为一个C++练习,随机尝试实现你自己的随机类,它并不像看起来那么难。