java - 如何模拟指数增长

标签 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 作为引擎。

最佳答案

看起来,假设随机数的分布是均匀的,对于 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 在这种情况下,但由于使用了 nextGaussian,所以倾向于 10 的平均值。

关于java - 如何模拟指数增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49778887/

相关文章:

java - 在 IntelliJ 中创建 jar 而不包含库?

java - JPA 和 MS SQL GenerationType.Identity 始终为 null

java - 如何将 java 连接到 Ms Access 2010?

java - 如何将JAVA中从dstream排序的前N个保存到TextFile

java - 如何修改Intent中类的名称(变量而不是硬编码)?

java - 我有可变数量的文本框如何在 servlet 中检索它们的值

java - 在 Google App Engine 中读取 Java Servlet 输入流时出现问题

java - 在 Java 中检索大对象的选择属性集合的一种更好的执行方式

java - 直接从 Java 调用 GWT RPC 服务

java - SimpleJdbcCall : get result of Microsoft/Sybase stored procedure call