我想创建一个类似地形的3D噪声发生器,在做了一些研究之后,我得出的结论是,Simplex Noise是迄今为止最好的噪声类型.
我觉得这个名字很容易引起误解,因为我在找到关于这个主题的资源方面遇到了很多麻烦,而且我找到的资源往往写得不好.
我基本上寻找的是一个很好的资源/教程,逐步解释单一噪声的工作原理,并解释如何将其实现到程序中.
我不是在寻找解释如何使用库或其他东西的资源.
我知道通过将输出rnorm()视为时间序列可以实现白噪声.有关如何模拟粉红噪音的任何建议?
我想创建一个使用Java的彩色噪声生成器,它将能够生成本文中定义的所有颜色:http://en.wikipedia.org/wiki/Colors_of_noise
我对如何产生噪声本身感到困惑,并对如何生成我可以让它通过扬声器输出感到困惑.
任何链接或提示将非常感谢!
我还看了另一个问题:Java生成声音
但我不完全理解其中一条评论中给出的代码中发生了什么.它也没有告诉我该代码会产生什么样的噪音,所以我不知道如何修改它会产生白噪声.
上周我开发了一个世界发电机(用于Minecraft mod).然而,我并不只是寻找Perlin噪音,而是基于细胞噪音.我想生成一种地下实验室,有几个不同大小的房间.
为了解释这个问题,我使用2D示例.
噪声生成器采用网格单元格位置(int x, int y),并返回具有此结构的对象:
boolean top;
boolean right;
boolean down;
boolean left;
int roomType;
Run Code Online (Sandbox Code Playgroud)
4个布尔代表启用或禁用的墙:
它分别roomType代表房间的类型.
最终结果应该是这样的:

这里,背景棋盘图案代表基础网格,黑色线条代表墙壁.这只是一个可以生成的简单示例,但在实际情况中,网格在x和y方向都是无限的.
我现在遇到的问题是噪声生成器只接受x和y坐标,它应该是它应该生成的网格单元的坐标.有一个种子可以为哈希函数生成更多随机种子:
long seed = 0x75fd239de48;
Random r = new Random(seed);
int seed1 = r.nextInt();
int seed2 = r.nextInt();
// etc.
Run Code Online (Sandbox Code Playgroud)
我可以使用哈希函数:,根据种子Hash.hash2D(int seed, int x, int y)返回double一个坐标随机.
这将提供为周围细胞生成信息的能力.
要轻松生成更大的房间,您可以设置房间的最大尺寸,并检查试图大于1x1的房间的区域.如果他们在那里,并将跨越到当前房间,房间将是另一个房间的延伸.但是,检查房间是否会延伸需要检查是否尚未延伸(否则,不需要的房间扩展看起来像是延伸到另一个房间的房间基础),这会进入无限循环.
在我的例子中,有一个给定的房间类型表,它们的大小和重量.例:
name: size [weight]
room-1: 1x1 [128]
room-2: 1x1 [128]
room-3: 2x1 [16]
room-4: 1x2 [16]
room-5: 2x2 [8]
room-6: 3x1 …Run Code Online (Sandbox Code Playgroud) 在我当前的项目中,我对计算大型模型网格的空间相关噪声感兴趣。噪声在短距离内应该是强相关的,而在长距离内是不相关的。我当前的方法使用多元高斯和协方差矩阵,指定所有单元格之间的相关性。
不幸的是,这种方法对于大型网格来说非常慢。您对如何更有效地生成空间相关噪声有什么建议吗?(不一定是高斯分布)
import scipy.stats
import numpy as np
import scipy.spatial.distance
import matplotlib.pyplot as plt
# Create a 50-by-50 grid; My actual grid will be a LOT larger
X,Y = np.meshgrid(np.arange(50),np.arange(50))
# Create a vector of cells
XY = np.column_stack((np.ndarray.flatten(X),np.ndarray.flatten(Y)))
# Calculate a matrix of distances between the cells
dist = scipy.spatial.distance.pdist(XY)
dist = scipy.spatial.distance.squareform(dist)
# Convert the distance matrix into a covariance matrix
correlation_scale = 50
cov = np.exp(-dist**2/(2*correlation_scale)) # This will do as a covariance matrix
# Sample some …Run Code Online (Sandbox Code Playgroud) 我对随机生成器的经验几乎为零。我在 C 中使用了标准 rand 函数,并且使用了柏林噪声。
但现在,我需要一个分辨率为 NxNxN(N 可能为 1e6 或更大)的立方体,其中充满白噪声(没有柏林平滑度或其他任何东西),其中我可以“选择”一个值,如果我重新选择相同的值,它应该是每次都是相同的结果。它应该被播种,这样如果我再次启动应用程序,结果需要相同。它不应该是安全的或其他什么,只是足够随机,以至于人类不应该能够仅通过思考来预测值。如果他真的用电脑分析的话,是可以预测的。
就像我会使用标准的 C rand 函数,设置种子并为 3 维执行嵌套 for 循环,并每次生成一个随机数,直到到达坐标。这当然是非常慢的。我需要快速的东西!
我在互联网上搜索过,但同时发现了很多却什么也没有。也许我正在寻找错误的关键字,但我还没有找到任何可以使用的东西。
有人可以帮助我开始吗?代码?一条链接?我并不真正关心我是否理解算法,但它应该易于实现和使用,而且应该特别快。
我正在尝试使用c4droid IDE为Android终端编写一个随机生成的世界的简单ASCII风格游戏.它有C++支持,基本上我正在array[width][height]使用规则rand()%2 - 1生成可用的瓷砖,0是墙.但是有问题.每当我'随机'生成地图时,它看起来都是一样的 - 因为rand()它不是真正随机的.我听说过使用HDD或其他部件创建的熵.问题是我在android上使用它因此对我来说很难实现,因为C++没有像Java一样使用,所以我在谷歌上找不到解决方案.如此简短的问题:如何在Android上使用c ++生成"非常真实"的随机数?
我知道这是一个主观问题,但我找不到答案.不过我会详细说明:
我有一个具有许多配置方法的类,因此您可以运行具有不同设置的特定算法.正确配置后,只需调用方法"generate()",它就会返回一个填充的2d数组.这是难以测试的方法.这很难,因为它返回一个高度图,其中包含随机性和大量数据.一般来说,我会拆分它,但这会打破封装,因为在实践中数据和算法的步骤也会因同样的原因而改变,而且没有人会使用另一个的separeted.我知道我可以模拟随机性(我实际上正在做),但无论哪种方式,编写测试都是太多的数据(例如,仅32到32的地图在单个测试中需要1024个断言) .除此之外,生成一张大地图最多可能需要3到4秒,这在测试环境中显然不太好.
此外,我首先尝试将数据与算法分开,并使算法纯功能(无数据,仅参数).虽然这是可测试的(因为我拆分算法),这导致大量的参数被传递到周围,并且是一个相当程序化的代码.
所以我不知道如何在这里进行.拆分类使得测试和理解更容易,但也破坏了封装非常糟糕.我会很感激这个主题,无论是实践的还是理论的.
提前致谢.
编辑:这是我编写的代码,类似于程序.
JavaRandom,Attenuation和RandomNumberProcessor是我应该保持在一起的类.
这是算法使用的数据:
package noise;
import noise.attenuation.DefaultAttenuation;
public final class DiamondSquareSettings {
public static final class Builder {
private static final double NEVER_ASSIGNED = 1.1;
private static final long DEFAULT_RNG_SEED = 33609606l;
private static final JavaRandom DEFAULT_RANDOM = new JavaRandom(DEFAULT_RNG_SEED);
private static final double DEFAULT_RANGE = 1;
private static final Attenuation defaultAttenuation = new DefaultAttenuation(0.7);
private Random builderRandom = DEFAULT_RANDOM;
private final double[] builderSeeds = {NEVER_ASSIGNED , NEVER_ASSIGNED , NEVER_ASSIGNED , …Run Code Online (Sandbox Code Playgroud) 我选择了一个使用setPixel(). 此应用程序的大部分运行时间都在setPixel()函数内花费,因此我希望提高函数执行的速度。
我对此进行了一些研究,发现:
int index = x + (y * Width);
int col = color.ToArgb();
if (this.Bits == null)
{
this.Bits = new Int32[Width * Height];
}
Bits[index] = col;
Run Code Online (Sandbox Code Playgroud)
已被推荐为一种更快的方法。但是,这会生成完全黑色的图像。
我不能 100% 理解图像处理和内存指针如何工作才能完全理解代码并将其重构为更好的东西。
这是该人实施之前的原始代码:
unsafe
{
var scan0 = (byte*)Iptr;
int bitmapStride = Stride;
int bitmapPixelFormatSize = Depth / 8;
index = (bitmapStride * y) + (x * bitmapPixelFormatSize);
if (bitmapPixelFormatSize == 4)
{
scan0[index + 3] = color.A;
scan0[index + 2] = color.R;
scan0[index …Run Code Online (Sandbox Code Playgroud) noise ×4
java ×3
random ×2
android ×1
audio ×1
c# ×1
c++ ×1
image ×1
performance ×1
perlin-noise ×1
pointers ×1
python ×1
python-3.x ×1
r ×1
seed ×1
tdd ×1
unit-testing ×1