首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与参数相关的PRNG

与参数相关的PRNG
EN

Stack Overflow用户
提问于 2012-10-01 15:02:36
回答 2查看 248关注 0票数 1

我对一个函数rand(x, y, seed)感兴趣,它基于参数返回(伪随机数),具有以下属性:

  1. 返回的值应该取决于它的3个参数,而而不是取决于到目前为止调用rand的次数。例如,假设这些调用,按照以下顺序: 兰德( 0,0,123) =1兰特(0,1,123) =2兰特(0,2,123) =3

然后用相同的参数调用rand,但顺序不同,我们应该得到相同的值。例如:

兰德( 0,1,123) =2兰特(0,2,123) =3兰特(0,0,123) =1

  1. 函数应该有一个好的(不错的,我真的不需要什么特别的)PRNG的通常性质:大周期,均匀分布等。返回适合于符号整数的正整数是很好的。如果你愿意的话,它也可以更高。
  2. 假设这些数字将用于生成矩阵。然后,改变种子应该确保生成的矩阵看起来尽可能不同于其他种子生成的矩阵。这应该发生在尽可能多的种子上:我不想让矩阵重复。

如果有帮助,我的种子将永远是以毫秒为单位的unix时间戳(如果这样做更容易的话,也可以以秒为单位)。所有参数都可以高达32位签名ints,但是在函数中使用64位值并不是问题。

我能用什么功能来做这个?

我的想法:

Perlin噪声似乎做了我想做的一些事情,但我不知道它作为一个PRNG到底有多合适,特别是在发行方面。我也不确定它的效率有多高,因为我的(x, y)参数将是相当随机的,而且我不能对所有这些参数进行预计算。

我还研究了以下功能:

代码语言:javascript
复制
p = 1400328593
rand(x, y, seed) = (x * x * seed + y * seed * seed + seed * x * y + seed) mod p
                 = (seed * (x * x + y * seed + x * y + 1)) mod p

这个看起来像,可以生成足够好的数字。基于我(非常弱)的测试,它们似乎也被很好地分发了。不过,测试这段时间比较困难,但我还没有这么做。

更新:

下面是上述函数的恩特输出,以C中的time(NULL)作为其种子,并为(x, y) in {0 ... 999} x {0 ... 999}生成值

熵=每字节3.312850位。 最佳压缩将使这个9207076字节文件的大小减少58 %。 9207076份样本的卡方分布为229710872.43份,随机超过此值的倍数小于0.01 %。 数据字节的算术平均值为52.3354 (127.5 =随机)。Pi的蒙特卡罗值为4.000000000 (误差27.32 %)。序列相关系数为0.036131 (完全不相关= 0.0)。

这在实践中是否足够好(理论上,上面的测试表明它一点都不好),还是有什么我应该使用的众所周知的东西?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-02 10:32:36

听起来你想要一个散列函数。如果安全性不太低,就选择一个安全的SHA1,因为它保证具有良好的分发特性;否则,您可以使用一个常见的哈希函数,比如FNV。只需使用种子和坐标作为输入数据,哈希作为随机值。

票数 2
EN

Stack Overflow用户

发布于 2012-10-01 16:58:42

您可以尝试使用布卢姆布卢姆。它具有一个属性,您可以直接计算级数的n‘the值,这似乎适合您的情况。它采用三个参数,p,q和x0。P和q是素数,x0是p和q的相关素数,所以你的参数x和y可以用来寻找x‘和y’s素数,然后它们适合于p和q,然后可以用第三个参数为x0找到一个合适的值。这有点乏味,而且Blum Blum Shub很慢,因为它是加密的RNG,但是如果您不需要速度,那么它就会工作,并且不会很难实现。

另一种方法是使用像CMWC这样的RNG,并使用类似x+ y^i + seed^(2i)之类的东西填充生成器的I‘位置,运行生成器一段时间(可能有几次等于它存储的值的数量),然后从其中提取一个值。

如果您想使用CMWC,可以查看我在github 这里上的实现,以及构造具有已知句点这里的生成器的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12675840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档