Nic*_*ner 12 java language-agnostic math distribution
我的单元格的数值可以是0到0之间的任何值Integer.MAX_VALUE.我想相应地对这些单元格进行颜色编码.
如果值= 0,那么r = 0.如果值是Integer.MAX_VALUE,则r = 255.但是它们之间的值怎么样?
我想我需要一个函数,其限制为x => Integer.MAX_VALUE为255.这个函数是什么?或者有更好的方法吗?
我可以做,(value / (Integer.MAX_VALUE / 255))但这将导致许多低值为零.所以也许我应该用日志功能来做.
我的大多数值都在[0,10,000]范围内.所以我想强调那里的差异.
Art*_*ius 16
"最公平"的线性缩放实际上是这样完成的:
floor(256 * value / (Integer.MAX_VALUE + 1))
Run Code Online (Sandbox Code Playgroud)
请注意,这只是伪代码并假设浮点计算.
如果我们假设Integer.MAX_VALUE + 1是2 ^ 31,那个/将给我们整数除法,那么它简化为
value / 8388608
Run Code Online (Sandbox Code Playgroud)
为什么其他答案是错误的
一些答案(以及问题本身)提出了一个变种(255 * value / Integer.MAX_VALUE).据推测,这必须使用round()或转换为整数floor().
如果使用floor(),唯一value产生255的是Integer.MAX_VALUE本身.这种分布不均匀.
如果使用round(),0和255每次击中的次数是1-254的一半.也不均匀.
使用上面提到的缩放方法,不会出现这样的问题.
非线性方法
如果要使用日志,请尝试以下操作:
255 * log(value + 1) / log(Integer.MAX_VALUE + 1)
Run Code Online (Sandbox Code Playgroud)
你也可以只取值的平方根(这不会一直到255,但你可以根据需要扩展它).
我认为日志适合对此有好处,但看看结果,我不太确定.
但是,Wolfram | Alpha非常适合尝试这类事情:
我从那开始,结果是:
r(x) = floor(((11.5553 * log(14.4266 * (x + 1.0))) - 30.8419) / 0.9687)
Run Code Online (Sandbox Code Playgroud)
有趣的是,事实证明,这给Artelius的答案提供了几乎相同的结果:
r(x) = floor(255 * log(x + 1) / log(2^31 + 1)
Run Code Online (Sandbox Code Playgroud)
恕我直言,你最好配备0-10000和10000-2 ^ 31的分割功能.