![]() |
1
4
你所说的通常被称为“柏林噪音”,这里有一个链接: http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
它仅根据x和y坐标返回一个介于-1.0和+1.0之间的数字(以及一个硬编码种子,您可以在应用程序开始时随机更改或保持原样)。 本文的其余部分是关于插值这些数字的,但是根据您想要这些数字的随机性,您可以将它们保持原样。注意这些数字是完全随机的。如果你改为使用余弦插值器,每5-6个索引使用一次生成的噪波,在中间进行插值,你就得到了heightmap数据(这就是我使用它的目的)。对于完全随机的数据跳过它。 |
![]() |
2
2
标准随机生成器通常是序列生成器,其中下一个元素都是从上一个元素生成的。所以要产生
另外,你可以用独立发电机改进你的方法(
|
![]() |
3
2
我认为你的第一个想法是实例化一个新的随机对象,这个对象由一些确定性散列(x坐标,y坐标,LazyRandomMatrix种子)作为种子,这在大多数情况下可能是合理的。一般来说,在托管堆上创建许多小对象是CLR非常擅长有效处理的事情。我不认为Random.ctor()非常昂贵。你可以很容易地衡量性能,如果它是一个问题。 一个非常类似的解决方案可能比创建一个好的确定性哈希更容易,就是每次使用两个随机对象。比如:
|
![]() |
4
2
下面是一个基于SHA1散列的解决方案。基本上,这会获取X、Y和种子值的字节,并将其打包到字节数组中。然后是字节数组的散列和用于生成
|
![]() |
5
2
PRNGs can be built out of hash functions.
虽然使用加密哈希在加密世界中更为常见,但我还是冒昧地使用了 MurmurHash 2.0 good results 作为PRNG(除非我在C代码中有fsc#kd,也就是说:)请随意使用任何其他合适的散列函数;加密的(MD5,TEA,SHA)也一样-尽管加密散列往往要慢得多。
|
![]() |
6
1
伪随机数生成器本质上是一个函数,它确定地计算给定值的后继值。 你可以发明一个简单的算法,从它的邻居那里计算出一个值。如果一个邻居还没有一个值,首先从它各自的邻居计算它的值。 像这样:
示例 后继(n)=n+1 计算价值 (2,4) : \ x 0 1 2 y +------------------- 0 | 627 628 629 1 | 630 2 | 631 3 | 632 4 | 633 这个例子算法显然不是很好,但你得到的想法。 |
![]() |
7
1
这种发电机的一个很酷的例子是 Blum Blum Shub ,这是一种易于随机访问的加密安全PRNG。不幸的是,它非常慢。 一个更实际的例子是著名的线性同余发生器。您可以很容易地修改一个允许随机访问。考虑一下定义:
pseudo linear ,不是线性的),但可以转换为非递归形式:
|
![]() |
8
0
据我所知,这里有两种基本算法:
在第一种情况下,您总是有生成新随机数的问题,尽管这可能没有您担心的那么昂贵。 在第二种情况下,问题是在转换操作期间可能会丢失随机性。然而,无论哪种情况,结果都是可重复的。 |
![]() |
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 7 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 8 月前 |
![]() |
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
![]() |
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
![]() |
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |