将随机浮点值重新映射到对数刻度
Remapping Random Float value to logarithmic scale
我有一个随机浮点数,它给我一个介于 0 和 1 之间的值。
我现在想重新映射该值,以便 50% 的时间结果为 0.01,25% 的时间为 0.02,12.5% 的时间为 0.04....
有点像这样:
- 50% = 0.01
- 25% = 0.02
- 12.5% = 0.04
- 6.25% = 0.08
- 3.125% = 0.16
- 1.5625% = 0.32
- 0.78125% = 0.64
或者换句话说,将 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
我有一个随机浮点数,它给我一个介于 0 和 1 之间的值。 我现在想重新映射该值,以便 50% 的时间结果为 0.01,25% 的时间为 0.02,12.5% 的时间为 0.04....
有点像这样:
- 50% = 0.01
- 25% = 0.02
- 12.5% = 0.04
- 6.25% = 0.08
- 3.125% = 0.16
- 1.5625% = 0.32
- 0.78125% = 0.64
或者换句话说,将 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