计算价格上涨的物品总价太慢

时间:2021-01-20 22:04:44

标签: python algorithm math game-development

我正在创建一个简单的闲置游戏,您可以在其中购买东西,并且您购买的每件商品的价格都会上涨。我有一个按钮,允许玩家单击一次即可购买最大数量。这很好用,但计算总价很慢,因为我是在一个 while 循环中这样做的。我该如何简化?

var accumulatedPrice = 0.0
var maxMultiplier = 0
while accumulatedPrice <= allMyMoney:
    var assetPrice = 4.8
    var priceGrowth = 1.12
    priceGrowth = pow(priceGrowth, asset.currentAmount+maxMultiplier-1)
    assetPrice *= priceGrowth
    accumulatedPrice += assetPrice
    maxMultiplier += 1

我稍微简化了我的代码,它不是用任何特定语言编写的。我实际上使用了一个大数字类来允许极高的数字,但数学与上面相同。当 maxMultiplier 最终变高时,它会变慢。

2 个答案:

答案 0 :(得分:0)

我似乎不明白这个问题。 我已经用 64 位最大整数 (9223372036854775807) 尝试过,它花了我 2.7418136596679688e-05 秒。

from time import time
import sys

all_money = sys.maxsize
asset_price = 1.8
price_growth = 1.12
next_asset_price = asset_price ** price_growth
amount = 0
start = time()

while all_money > 0:
    if all_money - next_asset_price < 0:
        print(f"Total: {amount}")
        break

    all_money -= next_asset_price
    amount += 1
    next_asset_price = next_asset_price ** price_growth

print(f"\nTotal runtime: {time()-start}")

答案 1 :(得分:0)

对于 n 项的总成本,您有这个循环公式:
S(n) = S(n-1) + BaseCost*(k^(n-1))
可以通过提取BaseCost来简化:
S(n) = BaseCost*(1 + k^1 + k^2 + k^3 + ... + k^(n-1))
这种有限几何级数有一个公式:
series formula
所以,我们原来的求和公式可以简化为:
S(n) = BaseCost*(1-k^n)/(1-k)
使用这个非循环公式,您可以将算法重写为一个简单的计算。
给定最大可用总和 Smax,我们可以这样做:
Smax*(1-k)/BaseCost = 1-k^n
n = log_k(1 - Smax*(1-k)/BaseCost)

我在此处的电子表格中对其进行了测试https://docs.google.com/spreadsheets/d/1sZMpmHzcNu6NWw9HJexlIz1onOMh3DdlJYiW548xlgM/edit?usp=sharing