首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -生成近随机数。(比java的随机类好)

Java -生成近随机数。(比java的随机类好)
EN

Stack Overflow用户
提问于 2015-12-20 03:46:20
回答 1查看 244关注 0票数 0

嘿哟!我正在制作一个2d沙箱游戏(像terraria)。一切都很好。到目前为止,它可以产生一个随机的地形和树木。不过,我遇到了一个问题。

我使用Java的随机类生成一个随机数,用于确定是否创建一棵树。问题是:树木似乎聚集在一起。我得到大面积没有树木,然后大面积的树木挤满了。我认为这是因为Java的随机类不够随机。

我是否可以安装JDK或任何外部库中包含的其他类来生成真正的随机数?预先感谢:D

编辑

代码语言:javascript
复制
Random rand = new Random();
rand.setSeed(worldGenerator.getSeed());
int randomNumber = rand.nextInt(1000) + 1; 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-20 03:55:32

这几乎肯定不是Java的Random的问题,而是统计中常见的错觉。这被称为聚类错觉。基本上,随机分布产生了密集和稀疏区域的集群,而不是所有的东西都被均匀地间隔,因为间隔是一种规律性的形式。

至于从随机分布中得到更均匀的分布,对于一维地图,您可以尝试一些大致达到以下效果的东西:

代码语言:javascript
复制
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);
    }
}

对于二维地图,您可以尝试更类似的方法:

代码语言:javascript
复制
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);
        }
    }
}

这两种情况下的主要思想都是通过在树之间有一个最大和最小的间距来创造你想要的规律。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34377765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档