快速增加并减慢达到预定义最大值的功能

Function which increases fast and slows down reaching predefined maximum

我正在创建一个计数算法,其中我以更大的增量增加数字,然后随着时间的推移增量变小,理想情况下达到零或 1。最终的总和值应该是预定义的。步骤数应该是一个输入参数并且可以变化。它似乎是一个具有最大值的对数函数。然而,对数函数增长到无穷大。

我发现最好的是对数的平方根:

val log = (1..10).map { Math.sqrt(Math.log(it * 1.0)) }
    val max = log.max()
    val rounded = log.map { it * 1000 / max!! }.map { Math.round(it) }

    rounded.forEachIndexed { i, l ->
        if (i + 1 < rounded.size)
            println("${rounded[i + 1] - rounded[i]}")
    }

然而,我最终还是没有得到非常小的增量。 如果范围是从 0 到 10: 549, 142, 85, 60, 46, 37, 31, 27, 23 如果范围是 20: 481, 125, 74, 53, 40, 33, 27, 23, 21, 18, 16, 14, 14, 12, 11, 10, 10, 9, 9

最后用什么算法得到1?

更新: 基于帕特里克公式,我做了这个解决方案:

`  val N = 18981.0
    val log = (1..50).map { N - N/it }
    val max = log.max()
    log.map { print("$it, ") }
    val rounded = log.map { it * N / max!! }.map { Math.round(it) }` 

重要的是 NDouble 而不是整数

对数的平方根也增长到无穷大。尝试

f(n) = N - N/n

它在 n = 1 时的值为 0,并且随着 n 无限增长而趋向于 N。如果您需要更精细的粒度,请添加一些系数并尝试使用它们,直到获得合理的值。例如,您可以使用 [1 + (n/1000)] 并获得类似但更慢的增长。您还可以使用 exp(-x) 或任何具有水平渐近线的函数并获得类似的行为。

f(n) = N - exp(-n)

再次添加一些系数,看看函数如何变化