4

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

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

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

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

4

1 回答 1

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";
    } 
 }

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

于 2013-09-25T10:18:35.900 回答