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

Get random number in sequence C++

本文关键字:随机数 C++ 获取      更新时间:2023-10-16

有没有一种方法可以使用随机生成器中内置的C++标准库来获得序列中的特定随机数,而不必全部保存?

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

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

此操作在用户代码中很常见,通常可以实现以特定于发动机的方式提供显著的性能对使z连续的等价naive循环的改进调用CCD_ 6。

给定discard,您可以通过对生成器进行补种、丢弃n-1值并使用下一个生成的值,轻松实现按顺序检索n的要求。

我不知道哪种标准RNG引擎(如果有的话)适用于discard的有效实现。花点时间做一些调查和分析可能是值得的。

您必须保存数字。可能还有其他变体,但它仍然需要保存一个数字列表(例如,根据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;
}

(我还没有编译这段代码,只是把它写成了"这类事情可能会起作用")

实现getRand()始终进行种子设定,然后返回给定的数字。不过,这会干扰系统中的所有其他随机数,而且速度会很慢,尤其是对于大索引。假设一个基于1的索引:

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

类似于cdmh的帖子,

也可以使用C++11中的以下内容:

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

退房:随机123

来自文件:

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