是否有一种优雅的方法可以创建一个在给定的浮点数列表中存在不的数字?如果这个数字不接近数组中的现有值,那就太好了。
例如,在列表[-1.5, 1e+38, -1e38, 1e-12]
中,选择像20
那样远离现有数字而不是0.0
的数字可能会很好。列表,但非常接近1e-12
。
我能够提出的唯一算法包括创建一个随机数并测试它是否不在数组中。如果是这样,重新生成。有更好的确定性方法吗?
答案 0 :(得分:6)
这是一种选择不在列表中的随机号码的方法,其中概率越高,越远离现有点。
按如下方式创建概率分布函数 f :
f(x)=<距离x最近的点的绝对距离
这样的函数给出了离你给定点越远的概率。 (请注意,它应该被标准化,以便函数下面的区域为1.)
创建 f 的原始函数 F (即 f 下面的累积区域,直到给定点)。
生成0到1之间的均匀随机数 x (这很简单!:)
通过将 F 的倒数应用于该值来获得最终结果: F -1 (x)。
这是一张描述现有数字为1.5,2.2和2.9情况的图片:
以下是对其工作原理的直觉:
你的概率越高(蓝线越高)越陡红线。
红线更陡峭, x 越有可能在此时点击红线。
例如:在给定的点,蓝线为0,因此红线是水平的。如果红线是水平的,则 x 击中该点的概率为零。
(如果你想要全范围的双打,你可以将min / max分别设置为-Double.MAX_VALUE和Double.MAX_VALUE。)
答案 1 :(得分:3)
如果您有约束,那么新值必须介于[min, max]
之间,那么您可以对值进行排序并插入具有最大绝对差值的两个相邻值的平均值。
在您的示例中,[-1e38, -1.5, 1e-12, 1e+38]
是有序列表。在计算绝对差值时,您会找到值(1e-12, 1e+38)
的最大差异,因此您将新值计算为((n[i+1] - n[i]) / 2) + n[i]
(简单平均值计算)。
<强>更新强>
此外,您还可以检查FLOAT_MAX
或FLOAT_MIN
值是否会给出好的候选人。只需检查它们与min
和max
的距离,如果结果值大于两个相邻值的最大差值,请选择它们。
答案 2 :(得分:0)
如果没有上限,只需将所有数字的绝对值相加,或者将它们全部减去。
另一种可能的解决方案是获取列表中最小的数字和最大的数字,并选择超出其边界的数字(可能是最大数字的两倍)。
或者最好的方法是计算平均值,最小值和最大值,只要标准偏差即可。然后,根据所有这些数据,你知道数字是如何构造的,并且可以相应地选择(所有聚集在给定的负值周围?Chosoe是正数。所有小数字?选择一个大数据等。)
的内容
number := 1
multiplier := random(1000)+1
if avg>0
number:= -number
if min < 1 and max > 1
multiplier:= 1 / (random(1000)+1)
if stdDev > 1000
number := avg+random(500)-250
multiplier:= multiplier / (random(1000)+1)
(只是我头顶的一个例子)
或另一种可能性是将所有数字排在一起。应该会产生好结果。