c# – 如何根据需要最好地生成随机数的静态数组?
发布时间:2020-12-15 19:36:32 所属栏目:百科 来源:网络整理
导读:我正在处理的应用程序需要一个随机数矩阵.矩阵可以随时在任何方向上生长,并不总是满的. (我可能最终会用四叉树或其他东西重新实现它,而不是带有很多空对象的矩阵.) 我需要一种方法来生成相同的矩阵,给定相同的种子,无论我以何种顺序计算矩阵. LazyRandomMatr
我正在处理的应用程序需要一个随机数矩阵.矩阵可以随时在任何方向上生长,并不总是满的. (我可能最终会用四叉树或其他东西重新实现它,而不是带有很多空对象的矩阵.)
我需要一种方法来生成相同的矩阵,给定相同的种子,无论我以何种顺序计算矩阵. 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]) 是的,如果我知道数组的维度,最好的方法是生成整个数组,只返回值,但它们需要独立生成并按需生成. 我的第一个想法是为每个调用新坐标初始化一个新的随机数生成器,用整个矩阵的种子的一些散列和调用中使用的坐标来播种它,但这似乎是一个可怕的黑客,因为它需要创建一个吨新的随机对象. 解决方法
你所说的通常被称为“Perlin Noise”,这里有一个链接:
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 coordonates返回介于-1.0和1.0之间的数字(以及一个硬编码的种子,您可以在应用程序的开头随机更改,或者保持原样). 本文的其余部分是关于插入这些数字,但根据您想要这些数字的随机性,您可以保持原样.请注意,这些数字将是完全随机的.如果您改为应用余弦插值器并使用每5-6个索引生成的噪声,插入其间,您将获得高度图数据(这是我用过的).跳过它来获取完全随机的数据. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |