我正在研究一种游戏,我希望能以指数的速度增长--比如,从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次(在这个量级上),一旦达到数百万的水平,它可能以每秒运行数十亿次操作而结束--对于这样一个简单的检查来说就有点大了。如果有必要的话,我会把它放一段时间,但我宁愿保持它的随机性。
我试图找出概率的方程式,但最后得到的结果是:
"999^x/1000^(x+1)"&rawformassumption={"F",+"Sum",+"sumvariable"}+->"x"&rawformassumption={"F",+"Sum",+"sumlowerlimit"}+->"0"&rawformassumption={"F",+"Sum",+"sumupperlimit2"}+->"1000"&rawformassumption={"C",+"sum+of+series"}+->+{"Calculator"}">从r+1到r=0的Σ(99^r/1000^(Σ))(其中p=概率)
是否有任何简单的方法可以将该概率更改为测试,或者在Java中有一种更简单的方法来实现此目的。
如果有帮助的话,我正在使用LibGdx作为引擎。
发布于 2018-04-11 15:52:04
看起来,假设随机数的分布是一致的,那么平均而言,对于人口数为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不等,但由于使用nextGaussian而倾向于10的平均值)。
发布于 2018-04-11 15:53:15
指数增长的显式公式是: x_t=x_*(1+r)^t,其中t是您的间隔(在您的例子中有60个间隔每秒),r是您的增长率。因此,在一个区间内增加的公式是:
x_1=x_*(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*(增长率)时,才应采用这一战略,否则Math.floor将使其过于不准确,甚至会削弱任何增长。
发布于 2018-04-11 15:57:36
目前你所做的是:对于每一个人,它有超过1000的机会产生一个新的人。你的代码在大数字上疯狂,因为你检查每个人。
对于大数字,您的算法相当于将人口乘以1.001 (1+1/1000)。对于大数,随机方面将消失(如解释这里)
但是对于小数目来说,随机是非常重要的。我认为处理这个问题的最好方法是定义一个总体水平,在这个水平上使用乘法,在这个水平下使用你的方法。
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);
}
}
}
}https://stackoverflow.com/questions/49778887
复制相似问题