Math 为什么不为随机数生成器使用素数?

Math 为什么不为随机数生成器使用素数?,math,random,Math,Random,我不完全确定RNG目前是如何工作的,但我知道他们把时间当作种子。。。那么,为什么不每次都使用不同的素数呢?据我所知,素数是我们所知道的唯一真正的随机数,因此,例如,每次程序要求一个随机数时,你给他第n个素数,并将n增加1。这不是完全随机的吗?因为n次和n+1次之间的差异是 除了随着程序运行时间的增加以指数方式生成数字的时间外,这还能实现什么 素数可能是随机的。。但是给定相同的N,我仍然会生成相同的N+1次素数-因此,与我们当前的伪随机算法没有区别,但是生成N+1次素数的停机时间不是恒定时间操作

我不完全确定RNG目前是如何工作的,但我知道他们把时间当作种子。。。那么,为什么不每次都使用不同的素数呢?据我所知,素数是我们所知道的唯一真正的随机数,因此,例如,每次程序要求一个随机数时,你给他第n个素数,并将n增加1。这不是完全随机的吗?因为n次和n+1次之间的差异是

除了随着程序运行时间的增加以指数方式生成数字的时间外,这还能实现什么

素数可能是随机的。。但是给定相同的N,我仍然会生成相同的N+1次素数-因此,与我们当前的伪随机算法没有区别,但是生成N+1次素数的停机时间不是恒定时间操作

使用时间作为种子是使确定性快速算法看起来随机的一种非常方便的方法。但事实并非如此,你提出的方法也并非如此


把时间想象成你的n,两者的工作原理几乎相同

好主意,但是这种构建伪随机数生成器的方法有两个问题

1] RNG的安全性部分取决于攻击者无法知道所使用的种子。虽然一个素数和下一个素数之间的距离是随机的,但素数序列不是随机的。换句话说,3是质数,我无法根据3是质数的事实预测下一个质数。但我已经知道5是下一个素数(因为所有低数素数都是已知的)。根据你的算法,如果我确定最后一个随机数的种子是3,然后是5,我可以猜测你将使用的下一个种子是7。所以这对低素数不起作用。从1到10006721的素数列表是众所周知的,并已出版

2] 寻找素数是困难的(计算代价昂贵)。虽然它对于低数值来说比较便宜,但是对于大素数来说却变得非常昂贵。大多数使用随机数的代码都假设系统会非常快地返回该数字,因此,例如,它被用于游戏的紧密循环中。该算法将打破这些用例


所以这不是构建随机数生成器的好方法。

好主意。编写一个有效返回下一个可用素数的函数。另外,找出如何共享该数字,以便所有应用程序不会获得相同的素数。(它现在的工作方式是,它们有一个“随机”数字的大列表,起始位置是根据当前时间(以滴答或毫秒为单位)选择的。)不,这不是随机的:事实上,这是相当可预测的。lcm生成器通常使用素数作为乘法因子……PRNG不使用时间作为种子。这句话过于具体(你所描述的不是PRNG的属性),即使我们对它进行概括,你也没有抓住PRNG的要点。一粒种子。这个种子可能是一个新的时间戳,但种子的原始解释与PRNG无关。什么?RNG基本上是一个散列函数,它根据seed返回一个非常不同的数字。我完全知道很难计算大素数,我知道这是非常不切实际的。我现在明白了,我的问题措辞不正确。。。我的基本想法是,有了这个,你可以得到真正的随机数。但是谢谢你的回答!