Java 带加权柏林噪声的地图生成器

Java 带加权柏林噪声的地图生成器,java,random,perlin-noise,stochastic,Java,Random,Perlin Noise,Stochastic,我有一个任意数量的柏林噪声图和每个图的权重。所有权重之和是1,但这不会有什么区别 我想得到关于重量的最大值的噪音 我的第一种方法是从每个柏林噪声中得到数字,将它们转换成百分比(我有一个循环表),乘以权重,然后选择最高值。但这种方法有一个巨大的缺陷:它区分较小的权重,偏爱较大的权重,因此会弄乱分布。我希望0.2的权重以20%的比例出现 我想将其用于地图生成器以选择平铺类型。我使用多个柏林噪声,因为我想使用许多不同的瓷砖类型彼此相邻,因此不能使用渐变 是否有人知道如何修复此缺陷,或以其他方式生成基于

我有一个任意数量的柏林噪声图和每个图的权重。所有权重之和是1,但这不会有什么区别

我想得到关于重量的最大值的噪音


我的第一种方法是从每个柏林噪声中得到数字,将它们转换成百分比(我有一个循环表),乘以权重,然后选择最高值。但这种方法有一个巨大的缺陷:它区分较小的权重,偏爱较大的权重,因此会弄乱分布。我希望0.2的权重以20%的比例出现

我想将其用于地图生成器以选择平铺类型。我使用多个柏林噪声,因为我想使用许多不同的瓷砖类型彼此相邻,因此不能使用渐变

是否有人知道如何修复此缺陷,或以其他方式生成基于平铺的贴图

编辑: 与此同时,我想出了一个几乎可以接受的解决方案:

final float[] values = new float[noises.length];
for (int i = 0; i < values.length; i++)
    values[i] = noises[i].get(x, y) * (1f + (weights[i] - 1f / noises.length));

int max = 0;
for (int i = 1; i < values.length; i++)
    if (values[i] > values[max])
        max = i;
return noises[max];
final float[]值=新的float[noises.length];
对于(int i=0;i值[max])
max=i;
返回噪声[max];

唯一的缺点就是不精确。即使重量为0f,噪音仍将在大约6%的时间内恢复。

也许解决方案如下:

Perlin pickOne(Perlin[] noise, double[] weights) {
   double sum = 0;
   for(double weight : weights) sum += weight;
   double choice = Math.random() * sum;
   for(int i = 0; i < weights.length; ++i) {
      choice -= weights[i];
      if(choice <= 0) {
         return noise[i];
      }
   }
   throw new IllegalArgumentException("Must have at least one weight!");
}
Perlin-pickOne(Perlin[]噪音,双[]重量){
双和=0;
对于(双重重量:重量)和+=重量;
double choice=Math.random()*求和;
对于(int i=0;i
我的建议是:

1) 将所有百分比*权重之和相加

2) 选择一个介于0和sum之间的随机数

3) 枚举添加百分比*权重项目,直到超过随机数-选择该项


这将对所有可能性进行随机分布,通过它们的百分比*权重进行加权,因此如果你有一个2、8和6,那么2出现在时间的2/16、8/16和6/16上。

你所说的“权重最高值”到底是什么意思?当我第一次读到这篇文章时,我假设你想要区分小权重的噪声贴图。比如perlin value*weight,然后选择最大的。但是我也希望选择的每一个都等于权重,例如权重为0.2的噪声应该是最高的20%的时间。Hm,因为这忽略了贴图值,所以生成的贴图looks非常随机和分散。