如何模拟指数增长

时间:2018-04-11 15:21:47

标签: java

我正在开发一款游戏,其中我希望增长能够呈指数级增长 - 例如,从2到3人中获得成功可能需要大约200万到300万人。但是,如果可能的话,我希望这种增长是随机的,以使其更加真实。到目前为止,我有一个运作良好的方法:

if (buildingCount > populationCount && foodCount > populationCount)
    for(int i=1;i<populationCount;i++) {
        int randomInt = random.nextInt(1000);
        if (randomInt == 42) {
            Data.main.setPopulationCount(populationCount+1);
        }
    }
if ((buildingCount < populationCount || foodCount < populationCount)&&populationCount>2)
    for(int i=1;i<populationCount;i++) {
        int randomInt = random.nextInt(1000);
        if (randomInt == 888) {
            Data.main.setPopulationCount(populationCount-1);
        }

然而,我意识到这将是不可持续的。它每秒运行大约60次(在这个数量级上),一旦达到数百万的水平,它可能最终每秒运行数十亿次操作 - 对于如此简单的检查有点多。如果必须,我会把它放在一个间隔,但我宁愿保持随机。

我试图找到概率的等式,但结果是:

Σ(99^r/1000^(r+1)) from r=0 to p (where p = probability)

是否有任何简单的方法可以将该概率更改为测试,或者使用Java中的简单方法来实现此目的。

如果它有助于我使用LibGdx作为引擎。

4 个答案:

答案 0 :(得分:4)

似乎假设随机数的分布是统一的,平均而言,对于人口数n / 1000,您的人口数量会增加n

要模仿这一点,最好将populationCount除以500并使用ThreadLocalRandom#nextGaussian来确定增加populationCount的增量,允许您摆脱for循环:

if (buildingCount > populationCount && foodCount > populationCount) {
    if (populationCount > 1000) {
        int randomNum = (int) ((ThreadLocalRandom.current().nextGaussian() / 2 + 0.5) * populationCount / 500);

        Data.main.setPopulationCount(populationCount + randomNum);
    } else {
        // Original for-loop here for populations less than 1000.
    }
}

对于人口10,000,在这种情况下,这会使人口平均增加10(范围从020,但有利于由于使用10),nextGaussian

答案 1 :(得分:1)

指数增长的明确公式是: X_T = X_0 *(1个+ R)^吨 其中t是你的间隔(在你的情况下,每秒有60个间隔) 而r是你的增长率。因此,一个区间增加的公式为:

X_1 = X_0 *(1 + r)的

x_0是以前的人口。

所以基本上,不是在每个区间循环你的整个人口数,你可以这样(增长率为0.1%):

Data.main.setPopulationCount(populationCount + Math.floor(populationCount * 0.001f));

对于人口减少,只需减去而不是添加。

Data.main.setPopulationCount(populationCount - Math.floor(populationCount * 0.001f));

为了整合随机性,你可以这样做:

Data.main.setPopulationCount(populationCount + Math.floor(populationCount * 0.001f * random.nextFloat()));

这样,每增加一次,您的增长率就会在0%到100%之间波动。

然后,这只是试验增长率的问题。

只有在人口超过5 *(1 /增长率)时才应采用此策略,否则Math.floor会使其过于不准确甚至减少任何增长。

答案 2 :(得分:1)

目前你所做的是:每个人有可能超过1000来生产一个新人。你的代码在大数字上疯狂,因为你检查每个人。

对于大数字,您的算法相当于将您的人口乘以1.001(1 + 1/1000)。对于大数字,随机方面将消失(如解释here

但对于少数,随机非常重要。我认为处理这个问题的最好方法是定义一个使用乘法的种群级别,然后使用你的方法。

if (buildingCount > populationCount && foodCount > populationCount)
    if(populationCount > 10000) { //I use 10000 has population level but do what you want
        for(int i=1;i<populationCount;i++) {
            int randomInt = random.nextInt(1000);
            if (randomInt == 42) {
                Data.main.setPopulationCount(populationCount+1);
            }
        }
    }
}

答案 3 :(得分:-1)

这里

用你的例子2-3 2M到3M 我会说使用* 1.5运算符

为例: 每60S - &gt;人们=人* 1.5

我不清楚你的需要

LIO