【发布时间】:2011-03-09 06:21:19
【问题描述】:
我正在开发的一个应用程序需要一个随机数矩阵。矩阵可以随时向任何方向增长,并且并不总是满的。 (我可能最终会使用四叉树或其他东西重新实现它,而不是使用包含大量空对象的矩阵。)
我需要一种方法来生成相同的矩阵,给定相同的种子,无论我以何种顺序计算矩阵。
LazyRandomMatrix rndMtx1 = new LazyRandomMatrix(1234) // Seed new object
float X = rndMtx1[0,0] // Lazily generate random numbers on demand
float Y = rndMtx1[3,16]
float Z = rndMtx1[23,-5]
Debug.Assert(X == rndMtx1[0,0])
Debug.Assert(Y == rndMtx1[3,16])
Debug.Assert(Z == rndMtx1[23,-5])
LazyRandomMatrix rndMtx2 = new LazyRandomMatrix(1234) // Seed second object
Debug.Assert(Y == rndMtx2[3,16]) // Lazily generate the same random numbers
Debug.Assert(Z == rndMtx2[23,-5]) // on demand in a different order
Debug.Assert(X == rndMtx2[0,0])
是的,如果我知道数组的维度,最好的方法是生成整个数组,然后只返回值,但它们需要根据需要独立生成。
我的第一个想法是为每次调用一个新坐标初始化一个新的随机数生成器,用整个矩阵种子的哈希值和调用中使用的坐标为其播种,但这似乎是一个可怕的 hack,因为它会需要创建大量新的Random 对象。
【问题讨论】:
-
随机性的质量对您来说很重要吗?那么,数字具有良好的“随机”分布是否重要?
-
我希望随机数具有与静态生成数组类似的分布(构造函数中具有已知维度的大
for循环)。基本上,最好(尽管显然不可能)的解决方案是在创建对象时生成一个无限的随机数矩阵,然后简单地返回所要求的任何值。 -
这将是艰难的。我不知道允许您随机访问随机序列的随机数生成器(虽然可能有一个),但伪随机数生成器会生成序列中的数字。听起来您想要做的是根据矩阵中的索引从序列中选择一个随机数,您所看到的问题是您需要预先生成整个序列。我能想到的最好的选择是选择一个弱prng,它根据索引和种子生成一个数字,分布不会很好......
-
“类似”? - 我从来没有听说过那个分布。 :) 但是您可以通过应用一些函数(在某些地方改变密度)来转换一些分布。