获取序列C ++中的随机数

时间:2013-07-28 12:56:18

标签: c++ random generator

有没有办法使用随机生成器中内置的C ++标准库来获取序列中的特定随机数,而不是全部保存它们?

srand(cTime);
getRand(1); // 10
getRand(2); // 8995
getRand(3); // 65464456
getRand(1); // 10
getRand(2); // 8995
getRand(1); // 10
getRand(3); // 65464456

5 个答案:

答案 0 :(得分:1)

C ++ 11随机数引擎需要实现一个成员函数discard(unsigned long long z)(第26.5.1.4节),它将随机数序列推进z步。复杂性保证相当薄弱:“不会比这更糟糕 z连续调用e()的复杂性。这个成员显然只是为了有可能在可能的情况下公开更多高性能的实现,如注释274所述:

  

此操作在用户代码中很常见,通常可以实现   以特定于发动机的方式,以提供显着的性能   相对于使z连续的等效幼稚循环的改进   致电e()

鉴于discard,您可以轻松实现您的要求,即通过重新播种生成器,丢弃n值并使用下一个生成的值来按顺序检索n-1个数字。

我不知道哪个(如果有的话)标准RNG引擎能够有效实现discard。您可能值得花时间进行一些调查和分析。

答案 1 :(得分:0)

你必须保存这些数字。可能还有其他变体,但它仍然需要保存一个数字列表(例如,根据getRand()的参数使用不同的种子 - 但这对保存它们并不是真正有益的)。

这样的事情会合理地运作,我会说:

int getRand(int n)
{
    static std::map<int, int> mrand;
    // Check if it's there. 
    if ((std::map::iterator it = mrand.find(n)) != mrand.end())
    {
        return it->second;
    }

    int r = rand();
    mrand[n] = r;
    return r;
}

(我没有编译这段代码,只是把它写成“这种东西可能有用”)

答案 2 :(得分:0)

实施getRand()以始终播种,然后返回给定的数字。但这会干扰系统中的所有其他随机数,并且速度很慢,尤其是对于大型索引。假设一个基于1的索引:

int getRand(int index)
{
    srand(999);  // fix the seed
    for (int loop=1; loop<index; ++loop)
        rand();
    return rand();
}

答案 3 :(得分:0)

与cdmh的帖子类似,

也可以使用C ++ 11:

#include<random>

long getrand(int index)
{
 std::default_random_engine e;
 for(auto i=1;i<index;i++)
     e();
  return e();
}

答案 4 :(得分:0)

退房: Random123

来自文档:

  

Random123是一个“基于计数器”的随机数发生器(CBRNG)库,其中第N个随机数可以通过将无状态混合函数应用于N来获得。