【问题标题】:Generating two independent random number sequences (C++)生成两个独立的随机数序列 (C++)
【发布时间】:2010-07-25 14:24:51
【问题描述】:

我希望能够做这样的事情(显然不是有效的 C++):

rng1 = srand(x)
rng2 = srand(y)

//rng1 and rng2 give me two separate sequences of random numbers
//based on the srand seed
rng1.rand()
rng2.rand()

有没有办法在 C++ 中做这样的事情?例如,在 Java 中,我可以使用我想要的种子创建两个 java.util.Random 对象。 C++ 中似乎只有一个全局随机数生成器。我确定有提供此功能的库,但无论如何只用 C++ 来完成它?

【问题讨论】:

  • 既然rand返回的数字是(伪)随机的,为什么需要不止一个生成器呢?从一个随机数生成器中获取 2n 个数应该与从两个随机数生成器中的每一个中获取 n 个数的结果相似。
  • @James:考虑一个排队模拟,其中一个随机源控制新任务的到达,另一个随机源影响完成每个任务的时间。人们可能希望多次重复每个实验,复制“任务到达”场景,但使用不同的“任务完成”统计数据,这需要多个可以独立播种的 RNG。
  • @Jim:我同意它可以用于此目的。我认为手动输入“随机”数据比依赖 PRNG 更好。
  • @Jim:确实是用来模拟排队系统的。 @James:模拟有 10^6 个事件。我不会手动输入数据:)
  • @James:使用确定性种子 PRNG 作为可重现的、名义上无限的随机“流”是很常见的。手动准备的流没有我能想到的优势。

标签: c++ random


【解决方案1】:

使用rand_r

【讨论】:

    【解决方案2】:

    在 TR1(和 C++0x)中,您可以使用 tr1/random 标头。它应该内置于现代 C++ 编译器(至少对于 g++MSVC)。

    #include <tr1/random>
    // use #include <random> on MSVC
    #include <iostream>
    
    int main() {
    
        std::tr1::mt19937 m1 (1234);  // <-- seed x
        std::tr1::mt19937 m2 (5678);  // <-- seed y
    
        std::tr1::uniform_int<int> distr(0, 100);
    
        for (int i = 0; i < 20; ++ i) {
            std::cout << distr(m1) << "," << distr(m2) << std::endl;
        }
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      你也可以使用Boost.Random

      More technical documentation 在这里。

      【讨论】:

        【解决方案4】:

        我只想指出,使用不同的种子可能不会为您提供统计上独立的随机序列。 mt19937 是一个例外。使用不同种子初始化的两个 mt19937 对象将以非常高的概率(序列重叠的可能性很小)或多或少(取决于你问谁)给你或多或少的统计独立序列。 Java 的标准 RNG 是出了名的糟糕。 mt19937 for Java 的实现有很多,应该优先于现有的 RNG。

        【讨论】:

        • “统计上”i.r.v. 是什么意思?
        【解决方案5】:

        正如@James McNellis 所说,我无法想象你为什么要这样做,以及你会得到什么好处。描述你想要达到的效果。

        【讨论】:

        • 最好将其保留为评论,而不是答案。
        【解决方案6】:

        无论出于何种原因,以下生成器都会相互干扰。我需要两个独立的生成器来完成一项任务,并且需要重建流。我没有深入研究代码,但 std::tr1 和 C++11 生成器似乎共享共同的状态。在下方添加 m2 会更改 m1 将提供的内容。

        std::tr1::mt19937 m1 (1234);  // <-- seed x
        std::tr1::mt19937 m2 (5678);  // <-- seed y
        

        我必须自己建造以确保独立。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-03
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多