在C ++中实现随机oracle(输出在范围内是随机的,但输出对于相同的输入是相同的)

时间:2013-09-25 05:50:46

标签: c++ c++11 random

我希望在C ++中实现random oracle。基本上,只是一个函数f:{1,...,n} - > [0,1],因此对于{1,...,n}中的每个输入i,输出f(i)是[0,1]中的随机值。但重要的是,每次调用f(i)都应该返回相同的值。

换句话说,我希望在整数索引的[0,1]中有一个非常大的独立且相同分布的随机变量表f。当然,我不想预先计算表并存储它。相反,我希望这个表能够即时实现。你给输入i,你从表f(i)得到价值。

实施它的最佳方法是什么?一种可能性是使用输入整数i本身作为随机数生成器的种子。那么f(i)将是用i作为种子生成的随机数。这够好吗?谢谢!

(此问题已根据有用的评论进行了编辑。)

1 个答案:

答案 0 :(得分:3)

每次调用函数时,您可以使用以下方法,而不是构建新的随机引擎和分发:

class F
{
    private:
       std::mt19937 generator;
       std::uniform_real_distribution<double> distribution; // choose your distribution here.
    public:
       F() : generator(), distribution(0, 1) {} // lower and upper bound here
       auto operator()(const size_t n) -> decltype(distribution(generator))
       {
          generator.seed(n);
          return distribution(generator);
       }
};

用法很简单:

 int main()
 {
    F f;
    for ( size_t i(0); i < 10; ++i )
    {
       std::cout << f(i) << "\n";
    } 
 }

它使用明确定义的数字为您的生成器播种,即您的数字,然后返回该分布中的值。