我正在开发一款游戏,其中我希望增长能够呈指数级增长 - 例如,从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作为引擎。
答案 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
(范围从0
到20
,但有利于由于使用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