gpt4 book ai didi

c# - 我怎样才能最好地按需生成随机数的静态数组?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:03:46 25 4
gpt4 key购买 nike

我正在开发的一个应用程序需要一个随机数矩阵。矩阵可以随时向任何方向增长,并不总是满的。 (我可能最终会使用四叉树或其他东西重新实现它,而不是使用包含大量空对象的矩阵。)

我需要一种方法来生成相同的矩阵,给定相同的种子,无论我以何种顺序计算矩阵。

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 对象。

最佳答案

您所说的通常称为“柏林噪声”,这里有一个链接供您使用:http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

那篇文章最重要的是2D中的噪声函数:

  function Noise1(integer x, integer y)
n = x + y * 57
n = (n<<13) ^ n;
return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
end function

它仅基于 x 和 y 坐标返回一个介于 -1.0 和 +1.0 之间的数字(以及一个硬编码的种子,您可以在应用程序开始时随机更改它或保持原样)。

本文的其余部分是关于对这些数字进行插值的,但是根据您想要这些数字的随机性,您可以让它们保持原样。请注意,这些数字将是完全随机的。如果您改为应用余弦插值器并每 5-6 个索引使用生成的噪声,在其间进行插值,您将获得高度图数据(这就是我使用它的目的)。跳过它以获得完全随机的数据。

关于c# - 我怎样才能最好地按需生成随机数的静态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3134759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com