我正在开发一款游戏,我希望在游戏中以指数级增长 - 因此,例如,从 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 作为引擎。
最佳答案
看起来,假设随机数的分布是均匀的,对于 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
(范围从 0
到 20
在这种情况下,但由于使用了 nextGaussian
,所以倾向于 10
的平均值。
关于java - 如何模拟指数增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49778887/