C++ 如何获取i';直接在C+中的第个随机数+;?
假设我想直接得到rand()生成的第100个随机数,而不生成之前的第99个随机数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,则可以重用最后一
让我重新措辞。是否有这样一个随机数生成器,它可以直接生成第i个随机数(给定一个种子),而无需迭代第一(i-1)代?例如,假设给定一个种子100,生成器G可以生成{1,2,5,7,3,6,…}。如何在不生成{1,2,5,7,3}的情况下得到6?从技术上讲,这取决于您的随机数源:
- 如果PRNG的周期正好为100,则可以重用最后一个值。而且,你的PRNG很可怕
- 如果您可以真正计算
而不需要PRNG(100)
的结果,您可以自己重新实现它。而且,你的PRNG仍然很可怕PRNG(99..0)
- 如果你的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个变量的生成器更可取。对于你的下一个问题:包括对原始问题的解释,并添加一些代码来显示你正在尝试完成什么(以及你已经尝试了什么)。每个人都会更友好,更了解你。。。也许有人会想出一个聪明的方法,可能会很有趣。