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

问题描述 投票:1回答:1

我正在创建一个计数算法,其中我以更大的增量增加数字,然后增量随时间变小,理想情况下达到零或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?

更新:根据Patricks公式,我做了这个解决方案:

`  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而不是整数

algorithm kotlin logarithm
1个回答
1
投票

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

f(n) = N - N/n

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.