【发布时间】:2014-03-21 12:23:02
【问题描述】:
例如:
如果rprng(seed,index) 是我的函数,那么对于任何一对(seed,index),对于给定的(seed,index),我应该总是得到相同的值。
例如:
rprng(4,2) = 17
rprng(4,5) = 21
rprng(4,2) = 17
【问题讨论】:
-
但它必须是伪随机的!
-
伪随机!=随机。伪随机仍然只是数学。
-
好吧,从头开始。你只是看起来你没有做任何研究。看看现有的不错的 PRNG,例如带进位的乘法、线性同余生成器,或者如果你能忍受的话,那就是 Mersenne twister。你怎么了?您不应该自己创建一个好的、原始的 PRNG,事实上您可能不应该尝试。此外,您的符号 不寻常。 PRNG 通常被认为是流而不是随机访问,即
prng(state)返回下一个数字并改变状态,像prng(seed, i)(通常称为skip)这样的函数要么不存在,要么是次要的。 -
使用散列函数。我会使用 SipHash(可能轮数更少),以种子为键,索引为消息。
-
@delnan,PRNG 通常被作为流来讨论是非常正确的,而 John 所要求的那种特性是不存在的或次要的。这就是为什么约翰可能进行了研究但没有找到他需要的东西。在某些重要领域(如程序纹理),对 PR 编号的“随机访问”(混淆使用术语)很重要:或者换句话说,PRNG 需要是无状态的,以便我们可以重新计算 random(a1, a2, ... a) 在许多不同的线程上,在许多显示帧上,并且始终获得一致的结果。
标签: c++ objective-c c random