选择列表中不存在的数字

Ric*_*ich 1 algorithm numbers

是否有一种优雅的方法来创建在给定的浮点数列表中存在的数字?如果这个数字不接近数组中的现有值,那将会很好.

例如,在列表中[-1.5, 1e+38, -1e38, 1e-12] ,可能很高兴选择一个类似于20远离现有数字的数字,而0.0不是列表中的数字,但非常接近1e-12.

我能够提出的唯一算法包括创建一个随机数并测试它是否不在数组中.如果是这样,重新生成.有更好的确定性方法吗?

aio*_*obe 6

这是一种选择不在列表中的随机数的方法,其中概率越高,越远离现有点.

  1. 创建概率分布函数f如下:

    f(x)= <距离x>最近的点的绝对距离

    这样的函数给出了离你给定点越远的概率.(注意它应该被标准化,以便函数下面的区域是1.)

  2. 创建原始函数˚F˚F(即低于累计面积˚F到一个给定的点).

  3. 生成一个0到1之间的均匀随机数x(这很简单!:)

  4. 通过将F的倒数应用于该值来获得最终结果:F -1(x).

这是一张描述现有数字给出的1.5,2.2和2.9情况的图片:

在此输入图像描述

以下是它工作原理的直觉:

  • 您拥有的概率越高(蓝线越高),红线就越陡峭.

  • 陡峭的红线,更可能它是X打在这一点上红线.

  • 例如:在给定点处,蓝线为0,因此红线是水平的.如果红线是水平的,那么x击中该点的概率为零.

(如果需要全范围的双精度数,可以将min/max分别设置为-Double.MAX_VALUE和Double.MAX_VALUE.)

  • 不仅是正确的方法,如果你想得到与其他数字最大分开的数字,你所要做的就是取最大值`f`(这很简单,因为它只是一个连续的分段线性函数集!) (2认同)