如何直接在C ++中获取第i个随机数?

时间:2014-12-16 13:54:49

标签: c++ random

假设我想直接得到rand()生成的第100个随机数,而不生成之前的第99个随机数。

让我改写一下。是否有这样的随机数生成器,它可以直接生成第i个随机数(给定种子),而不需要迭代第一代(第i-1)代?例如,假设给定种子100,生成器G可以生成{1,2,5,7,3,6,...}。如何在不生成{1,2,5,7,3}的情况下获得6?

3 个答案:

答案 0 :(得分:3)

从技术上讲,它取决于您的随机数源:

  1. 它是一个真正随机的硬件设备(它不会是),你的请求是完全不可能的。

  2. 它是pseudo-random number generator:答案取决于使用的确切生成器。

    • 如果您的PRNG的周期恰好为100,那么您可以重复使用最后一个值。此外,你的PRNG太可怕了
    • 如果您可以真实地计算PRNG(100)而无需PRNG(99..0)的结果,则可以自行重新实现。此外,你的PRNG仍然很可怕
    • 如果您的PRNG并不可怕,那么您运气不好。你只需要生成所有中间值并抛出99离开

答案 1 :(得分:1)

通常不可能。伪随机数生成器具有内部状态,当生成新数时,该状态会发生变化。虽然你可以有一个生成器,你可以一次跳过几次迭代,但算法必须设计成使其成为可能。您可以检查某些rand()实现的来源,看看是否可行。虽然,我认为你可以做到这一点的随机数生成器不会产生非常高质量的随机数......

但是,考虑到您的需求,请考虑从迭代次数中获取足够质量的哈希值。如果您没有使用加密/安全应用程序,MD5可能很好。如果需要,将种子组合到您计算哈希值的数据中。

答案 2 :(得分:1)

我将假设您需要确定性行为并且正在使用C ++

使用std::mersenne_twister_engine,这是一个伪随机数生成器,可以使用种子轻松实例化。

此外,您可以访问函数discard,它完全符合您的要求。