Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 随机数生成缺少同一种子的模式_C++_Random - Fatal编程技术网

C++ 随机数生成缺少同一种子的模式

C++ 随机数生成缺少同一种子的模式,c++,random,C++,Random,我正在为一个特定的种子生成一个随机数…所以我有一个名为seed的属性,我允许用户设置它。我给他两个选择:重置和触发。重置将重新开始生成随机数。触发器将生成下一个随机数。伪代码有点像 ::setSeed( unsigned & seed ) { m_seed = seed } ::reset() { m_seed = getcurrentseed() srand(m_seed); } ::trigger() { raValue = minValue + (

我正在为一个特定的种子生成一个随机数…所以我有一个名为seed的属性,我允许用户设置它。我给他两个选择:重置和触发。重置将重新开始生成随机数。触发器将生成下一个随机数。伪代码有点像

::setSeed( unsigned &  seed )
{
   m_seed = seed
}

::reset()
{
   m_seed = getcurrentseed()
   srand(m_seed);
}

::trigger()
{
    raValue = minValue + ( rand() % (maxValue-minValue+1) );
}
对于一个特定的种子,如果我5次生成5个随机值……有时我会看到其中一个集合中缺少一个值。原因可能是什么

例如

seed(5)
rand()
rand()
rand()
seed(5)
rand()
rand()
rand()
在第二次seed5调用之后,有时我会得到一个不同的数字序列,或者我错过了前一个序列中的一个数字

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++练习,随机尝试实现自己的随机类,

你使用C还是C++?它们不是同一种语言,你可能根本不应该在C++中使用SRAND。为了我们知道原因,你需要删除伪代码并给我们显示确切的代码。给我们复制问题的真实代码。用于复制问题的代码调用了一些名为seed的函数和一些名为rand的函数,这两个函数的代码均未显示。您将显示一些名为trigger的代码,这些代码未被调用。等等我们需要复制这个问题来理解它。顺便说一句,在rand%minValue+rand%maxValue-minValue+1中,每次可以按任意顺序调用rand。m_seed=getcurrentseed这是做什么的?我以为m_seed是当前的seed?如果我在一个全局名称空间中设置seed..应该吗suffice@sameerkarjatkar把你的问题放在这里表明这很可能是不够的。我真的认为你的问题仍然很模糊,无法得到一个有用的答案。难道不可能分解您的用例以显示解决方案的哪一部分导致了问题吗?如果我和其他人阅读了RandomNodeLogic::process,这就意味着不超过MyThing::doIt,而且参数类型对我们猜测您想要实现的目标没有帮助。但是你的假设是srand5;兰德;兰德;兰德;srand5;兰德;兰德;兰德;给出a、b、c、a、b、c在清洁环境中有意义