我正在创建一个计数算法,其中我以更大的增量增加数字,然后增量随时间变小,理想情况下达到零或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) }`
重要的是N
是Double
而不是整数
对数的平方根也增长到无穷大。尝试
f(n) = N - N/n
这在n = 1时具有值0并且随着n无限制地增长而倾向于N.如果你需要更精细的粒度,添加一些系数并使用它们直到你得到合理的东西。例如,您可以使用[1 +(n / 1000)]并获得类似但增长缓慢的速度。您还可以使用exp(-x)
或具有水平渐近线的任何函数,并获得类似的行为。
f(n) = N - exp(-n)
再次,添加一些系数,看看函数如何变化