加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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个索引生成的噪声,插入其间,您将获得高度图数据(这是我用过的).跳过它来获取完全随机的数据.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读