比例数<= 255?

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,但你可以根据需要扩展它).

  • 也许评论家现在可以看到它与语言无关,即使编码人员正在使用一种真正的语言 (2认同)

Bob*_*man 5

我认为日志适合对此有好处,但看看结果,我不太确定.

但是,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的分割功能.