是否有一個優雅的方法來創建一個數字?不是存在於給定的浮點數列表中嗎?如果這個數字不接近數組中的現有值,那將會很好。選擇一個不在列表中的數字
例如,在列表中[-1.5, 1e+38, -1e38, 1e-12]
它可能是不錯的選擇一個數字,如20
這是「遠」離而不是0.0
這是不是在列表中,但非常接近1e-12
現有的數字。
我已經能夠想出的唯一算法涉及到創建一個隨機數並測試它是否不在數組中。如果是這樣,再生。有更好的確定性方法嗎?
是否有一個優雅的方法來創建一個數字?不是存在於給定的浮點數列表中嗎?如果這個數字不接近數組中的現有值,那將會很好。選擇一個不在列表中的數字
例如,在列表中[-1.5, 1e+38, -1e38, 1e-12]
它可能是不錯的選擇一個數字,如20
這是「遠」離而不是0.0
這是不是在列表中,但非常接近1e-12
現有的數字。
我已經能夠想出的唯一算法涉及到創建一個隨機數並測試它是否不在數組中。如果是這樣,再生。有更好的確定性方法嗎?
如果您有約束條件,新值必須介於[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
的距離,並且如果結果值大於兩個相鄰值的最大差值,請選取它們。
這將工作得很好。我看到唯一的缺點是所有生成的值都是正數。 – ramsesoriginal 2012-07-17 12:53:21
@ramsesoriginal:我添加了具體公式。標誌不應該有問題。 – 2012-07-17 13:10:10
我明白了。好的解決方案 – ramsesoriginal 2012-07-17 14:13:26
如果沒有上限,只需要總結所有數字的絕對值,或者全部減去它們。
另一個可能的解決方案是獲得列表中最小的數字和最大的數字,並選擇超出範圍的東西(可能是最大數字的兩倍)。
或者最好的方法是計算平均值,最小值和最大值,只要標準偏差。然後,所有這些數據,你就知道這些數字是如何構成的,並可以相應地(圍繞給定負值所有的集羣?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)
的(只是舉個例子,從我的頭頂部)線
或者另一種可能性將是所有的數字XOR在一起。應該產生好的結果。
這裏有一種方法可以選擇隨機號碼不在列表中,其中的概率越高,離現有點越遠。
˚F創建概率分佈函數如下:
F(X)= <至點的絕對距離最接近x >
這樣函數給出的更高概率距離給定的點越遠。 (請注意,它應該被歸一化,使得該函數下方的面積爲1)
創建原始功能的˚F˚F(即累積的區域下方˚F到一個給定的點)。
生成均勻隨機數,X,在0和1之間(這很容易:)
通過應用的倒F到價值得到最終結果:˚F- 1(x)。
這裏的描述與1.5,2.2和2.9的情況下給出現有的數字圖片:
這就是爲什麼它的工作原理的直覺:
你有更高的概率(藍線越高)陡峭紅線是。
的陡峭的紅線,更可能它是X打在這一點上紅線。
例如:在給定的點上,藍線是0,因此紅線是水平的。如果紅線是水平的,那麼x命中該點的概率爲零。
(如果你想全方位雙打的,你可以最小/最大分別設置爲-Double.MAX_VALUE和Double.MAX_VALUE。)
你有沒有對範圍內的任何限制 - 例如,如果您要對列表進行排序,那麼生成的數字始終低於最小值或高於最大值 - 該孔是否可以接受? – Nim 2012-07-17 12:35:15
這是一個好主意,但不幸的是,我有可能在列表中同時擁有最大和最小32位浮點數。 – Rich 2012-07-17 12:36:33
嗯,在這種情況下,排序+二進制搜索,然後測試可接受的「距離」是我所能想到的最好的。 – Nim 2012-07-17 12:38:36