1

浮動小数点数の特定のリストに存在しない数を作成するための洗練された方法はありますか?この数値が配列内の既存の値に近くない場合は便利です。

たとえば、リストでは、リストにないが、に非常に近い既存の番号から「遠い」[-1.5, 1e+38, -1e38, 1e-12] ような番号を選択すると便利な場合があります。200.01e-12

私が思いついた唯一のアルゴリズムは、乱数を作成し、それが配列にないかどうかをテストすることです。その場合は、再生成します。より良い決定論的アプローチはありますか?

4

3 に答える 3

5

リストにない乱数を選択する方法を次に示します。この確率は、取得した既存のポイントから離れているほど高くなります。

  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がその点に当たる確率はゼロです。

(double の全範囲が必要な場合は、min / max をそれぞれ -Double.MAX_VALUE および Double.MAX_VALUE に設定できます。)

于 2012-07-17T13:22:50.507 に答える
3

新しい値がその間のどこかになければならないという制約がある場合は、[min, max]値を並べ替えて、絶対差が最大の2つの隣接する値の平均値を挿入できます。

あなたのサンプルケース[-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 つの隣接する値の最大差よりも大きい場合は、それらを選択します。

于 2012-07-17T12:45:18.373 に答える
0

上限がない場合は、すべての数値の絶対値を合計するか、すべてを減算します。

別の可能な解決策は、リスト内の最小数と最大数を取得し、それらの範囲外のものを選択することです (おそらく最大数の 2 倍)。

または、おそらく最良の方法は、標準偏差である限り、平均、最小および最大の数を計算することです。次に、このすべてのデータを使用して、数値がどのように構造化されているかを把握し、それに応じて選択できます (特定の負の値の周りにすべてがクラスター化されていますか? 正の値を選択します。すべての小さな値は? 大きな値を選択するなど)。

の線に沿った何か

    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 することです。良い結果が得られるはずです。

于 2012-07-17T12:42:36.050 に答える