Java - 生成近似随机数。 (优于 java 的随机 class)
Java - Generate near random number. (Better than java's Random class)
嘿嘿!我正在制作一个 2d 沙盒游戏(比如泰拉瑞亚)。一切正常。到目前为止它可以生成随机地形和树木。不过我遇到了一个问题。
我使用 Java 的随机 class 来生成一个随机数,我用它来确定是否创建一棵树。问题是:树木似乎聚集在一起。我得到没有树木的大片区域,然后是长满树木的大片区域。我认为这是因为 Java 的随机 class 不够随机。
JDK 中是否包含任何其他 classes 或我可以安装的可以生成真正随机数的任何外部库?提前致谢 :D
---编辑----
这是我生成数字的方法。
Random rand = new Random();
rand.setSeed(worldGenerator.getSeed());
int randomNumber = rand.nextInt(1000) + 1;
这几乎肯定不是 Java 的 Random
的问题,而是统计学中的常见错觉。这被称为 Clustering Illusion。基本上,随机分布会创建密集区域和稀疏区域的集群,而不是均匀分布的所有区域,因为均匀分布是一种规律性。
至于从随机分布中获得更均匀的分布,对于一维地图,您可以尝试大致达到以下效果:
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);
}
}
}
这两种情况的主要思想是通过在树之间设置最大和最小间距来创建您想要的规律性。
嘿嘿!我正在制作一个 2d 沙盒游戏(比如泰拉瑞亚)。一切正常。到目前为止它可以生成随机地形和树木。不过我遇到了一个问题。
我使用 Java 的随机 class 来生成一个随机数,我用它来确定是否创建一棵树。问题是:树木似乎聚集在一起。我得到没有树木的大片区域,然后是长满树木的大片区域。我认为这是因为 Java 的随机 class 不够随机。
JDK 中是否包含任何其他 classes 或我可以安装的可以生成真正随机数的任何外部库?提前致谢 :D
---编辑---- 这是我生成数字的方法。
Random rand = new Random();
rand.setSeed(worldGenerator.getSeed());
int randomNumber = rand.nextInt(1000) + 1;
这几乎肯定不是 Java 的 Random
的问题,而是统计学中的常见错觉。这被称为 Clustering Illusion。基本上,随机分布会创建密集区域和稀疏区域的集群,而不是均匀分布的所有区域,因为均匀分布是一种规律性。
至于从随机分布中获得更均匀的分布,对于一维地图,您可以尝试大致达到以下效果:
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);
}
}
}
这两种情况的主要思想是通过在树之间设置最大和最小间距来创建您想要的规律性。