嘿哟!我正在制作一个2d沙箱游戏(像terraria)。一切都很好。到目前为止,它可以产生一个随机的地形和树木。不过,我遇到了一个问题。
我使用Java的随机类生成一个随机数,用于确定是否创建一棵树。问题是:树木似乎聚集在一起。我得到大面积没有树木,然后大面积的树木挤满了。我认为这是因为Java的随机类不够随机。
我是否可以安装JDK或任何外部库中包含的其他类来生成真正的随机数?预先感谢:D
编辑
Random rand = new Random();
rand.setSeed(worldGenerator.getSeed());
int randomNumber = rand.nextInt(1000) + 1; 发布于 2015-12-20 03:55:32
这几乎肯定不是Java的Random的问题,而是统计中常见的错觉。这被称为聚类错觉。基本上,随机分布产生了密集和稀疏区域的集群,而不是所有的东西都被均匀地间隔,因为间隔是一种规律性的形式。
至于从随机分布中得到更均匀的分布,对于一维地图,您可以尝试一些大致达到以下效果的东西:
Random rand = new Random();
int i=0;
while(i<mapSize){
int distanceToNextTree = rand.nextInt(MAX_DISTANCE_BETWEEN_TREES-MIN_DISTANCE_BETWEEN_TREES)
+MIN_DISTANCE_BETWEEN_TREES;
i = i+distanceToNextTree;
if(i< mapSize){
putTree(i);
}
}对于二维地图,您可以尝试更类似的方法:
Random rand = new Random();
int deltaX = MIN_WIDTH_BETWEEN_TREES;
int deltaY = MIN_HEIGHT_BETWEEN_TREES;
for(int x=0; x<MAP_WIDTH; x+=deltaX){
for(int y=0; y<MAP_HEIGHT; y+=deltaY){
boolean chunkHasTree = rand.nextBoolean();
int chunkCenterX = x+deltaX/2;
int chunkCenterY = y+deltaY/2;
if(treeWithinRange(chunkCenterX,chunkCenterY,MAX_DISTANCE_BETWEEN_TREES)){
//force a tree if there aren't any nearby
chunkHasTree = true;
}
if(chunkHasTree && chunkCenterX<MAP_WIDTH && chunkCenterY<MAP_HEIGHT){
placeTree(chunkCenterX,chunkCenterY);
}
}
}这两种情况下的主要思想都是通过在树之间有一个最大和最小的间距来创造你想要的规律。
https://stackoverflow.com/questions/34377765
复制相似问题