将随机浮点值重新映射到对数刻度

Remapping Random Float value to logarithmic scale

我有一个随机浮点数,它给我一个介于 0 和 1 之间的值。 我现在想重新映射该值,以便 50% 的时间结果为 0.01,25% 的时间为 0.02,12.5% 的时间为 0.04....

有点像这样:

或者换句话说,将 0.0 - 0.5 重新映射到 0.00 - 0.01 和 0.50 - 0.75 到 0.01 - 0.02...

我想我可以用对数函数来做到这一点,但我不知道怎么做。

嗯,我不确定你在倒数第二行的措辞如何,但我假设你正在编写的函数是映射 [0,1.0] st。 0.05 -> 0.01,0.25 -> 0.02 对吗?

如果我关注,则 0 -> 0.1 和 1.0 -> -0.11。

在我看来,绘制出来的图形看起来很立方,而不是对数。已经有一段时间了,但我认为拉格朗日有一个公式可以用来对函数进行插值

https://en.wikipedia.org/wiki/Lagrange_polynomial

希望对您有所帮助!

给定x,区间(0, 1)中的一个数,求公式为2^floor(-ln(x)/ln(2)) * 0.01.

  • t = -ln(x)/ln(2) - x.
  • 的负底 2 对数
  • u = 2^floor( t ) - 回合 t 并加注 2。
  • u * 0.01 - 乘以 0.01。

Python中的示例:

import math
arr=[2**int(  (-math.log(random.random())) / math.log(2) ) * 0.01 for i in range(1000)]
print(arr)
print(sum(1 if u==0.01 else 0 for u in arr)/len(arr))

还有另一种方法可以继续。让x再次成为你的号码。

base=0.01
v=x # Original number
if base!=0:
   while v<0.5:
      base*=2
      v*=2
print(base) # Mapped number