Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取i';直接在C+中的第个随机数+;?_C++_Random - Fatal编程技术网

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

C++ 如何获取i';直接在C+中的第个随机数+;?,c++,random,C++,Random,假设我想直接得到rand()生成的第100个随机数,而不生成之前的第99个随机数 让我重新措辞。是否有这样一个随机数生成器,它可以直接生成第i个随机数(给定一个种子),而无需迭代第一(i-1)代?例如,假设给定一个种子100,生成器G可以生成{1,2,5,7,3,6,…}。如何在不生成{1,2,5,7,3}的情况下得到6?从技术上讲,这取决于您的随机数源: 这是一个真正的随机硬件设备(不会),您的请求完全不可能 答:答案取决于所使用的确切发电机 如果PRNG的周期正好为100,则可以重用最后一

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


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

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

  • 这是一个真正的随机硬件设备(不会),您的请求完全不可能

  • 答:答案取决于所使用的确切发电机

    • 如果PRNG的周期正好为100,则可以重用最后一个值。而且,你的PRNG很可怕
    • 如果您可以真正计算
      PRNG(100)
      而不需要
      PRNG(99..0)
      的结果,您可以自己重新实现它。而且,你的PRNG仍然很可怕
    • 如果你的PRNG不可怕,那你就倒霉了。您只需生成所有中间值并丢弃99

  • 通常不可能。伪随机数生成器具有内部状态,在生成新数字时会发生变化。虽然你可以有一个生成器,在那里你可以一次跳过几次迭代,但算法的设计必须使之成为可能。您可以检查一些
    rand()
    实现的源代码,看看它是否可行。尽管如此,我认为一个随机数发生器,如果你能做到这一点,将不会产生非常高质量的随机数


    然而,考虑到您的需要,考虑从迭代号中获取足够的质量的散列值。如果您不使用加密/安全应用程序,MD5可能很好。如果需要,将种子与计算散列的数据相结合。

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

    使用
    std::mersenne_twister_engine
    ,这是一个伪随机数生成器,可以很容易地用种子进行实例化


    此外,您还可以访问函数
    discard
    ,该函数正是您想要的。

    它是随机的,有什么意义?(虽然随机性不是很好)这是一个随机数。你为什么要这么做?这就像选择一个“随机”随机数。@Skyqe应该是。不要依赖于此,如果你需要使用种子和确定性行为,请使用更合适的方法。但这不是一个好问题。前99个有什么问题吗?是的,但为什么?这似乎是一件不寻常的事情,因为第100个伪随机数并不比第一个、第二个或第99个更随机,客观上也不比第一个、第二个或第99个更好。我仍然不明白OP的要求/他们为什么需要这个,但很好的解释我不确定你的第2点。我所知道的所有PRNG都是基于类似于
    I[n]=f(I[n-1])
    (对于
    n
    th随机数)。如果您知道
    f
    ,应该可以找到
    f'
    ,这样
    i[n]=f'(n)
    。(然而,
    f'
    可能非常复杂。这当然意味着知道
    f
    ,在
    rand
    的情况下,这一点没有被指定。)@James Kanze-Hmm,这是一个很好的观点。但正如你所说,i[n]=f'(n)可能非常复杂。@Skyqe可能。我从未尝试过为PRNG中使用的函数类型计算它,但我怀疑如果
    f'
    不是超级复杂,那么它将不是一个非常好的PRNG。是的,1和2都不可信,我只是在用尽可能。我问这个问题是因为我在某个地方读到,只要有一个种子和一个索引I,就可以直接生成四个相互独立的二进制随机数。@Skyqe我给答案添加了一个可能的解决方案。Blum-Blum-Shub算法是个例外。它很慢,但非常安全,如果需要,您可以直接在数学上生成第十亿个值,而无需迭代。不过,
    discard
    具有线性复杂度。似乎您要求的是恒定时间“提前”操作。。。但我不知道有哪一个强大的PRNG允许这样做。所以你们真的理解了我的问题。我只希望这种线性复杂度是相当便宜的。如果你的程序受到随机生成器
    丢弃操作的复杂度的严重影响,那么你的程序或设置都有问题。虽然我只能推测,因为您没有展示代码或讨论您的动机。然而,你的问题(一旦理解)是正确的。我可以向你解释我的动机。实际上,我想做的是使用随机二进制变量绘制一组区间。假设整个域的长度为N,那么变量的总数也是N。为了绘制一个区间[a,b],我需要知道这个区间内的二进制变量。一个变量可能重复使用多次,因为间隔可能相互重叠。因为我不想为大N存储这些变量,所以可以直接生成第I个变量的生成器更可取。对于你的下一个问题:包括对原始问题的解释,并添加一些代码来显示你正在尝试完成什么(以及你已经尝试了什么)。每个人都会更友好,更了解你。。。也许有人会想出一个聪明的方法,可能会很有趣。