0

1に非常に近い浮動小数点数にint>0を掛けると、1と解釈される可能性があります。

つまり、Math.random()が可能な限り最高の結果(1.0より1ステップ下)を返す場合、

(int)(Math.random() * 8)

8か7か?

実際の例として、この頻繁に使用される構成により、インデックスが範囲外のエラーになる可能性があります。

someArray[(int)(Math.random() * someArray.length)];

特にJavaとActionScript3の回答に興味がありますが、これらはすべて浮動小数点演算に同じルールを使用していると思います。どのプラットフォームでも回答が役立つでしょう。

更新:私はすでに回答を受け入れましたが、ActionScript 3でもこれがうまくいかないことを確認していただければ幸いです。同僚が、一度はうまくいかなかったと報告したことが、この質問をするきっかけになったからです。

4

3 に答える 3

1

8は2の累乗であるため、floatにそれを掛けても、オーバーフローしない限り、値に精度が追加または削除されることはありません。他の数値、特に浮動小数点数(2の負の累乗以外、たとえば0.25、0.0625など)を乗算すると、精度が低下します。

于 2012-04-27T21:03:08.773 に答える
0

java(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html)でMath.randomを使用すると、値は0.0以上1.0未満にすることができます。

値0.999999の1つのテストを使用すると、(int)(Math.random()* 8)の値は8になります。次のコードを使用して実験をテストできます。

public static void main(String args[]) {
        for (int i = 0; i <= 100; i++) {
            double frac1=0.999999999999999999 ;
            double frac=Math.random() ;
            int integer=(int) (frac*8);
            int integer1=(int) (frac1*8);
            System.out.println( integer+"-"+frac);
            System.out.println( integer1+"-"+frac);
        }
    }

ただし、Math.random()* 8は、Math.randomに返される値に応じて、1、2、3、4、5、7、6などの他の値を返すことができます。サンプルコードを実行してこれをテストできます

于 2012-04-27T21:14:35.750 に答える
0

実際、全数検索すると、floatを含む32ビット整数ではこれが発生しないことがわかります。

public static void main(String[] args) {
    int repr = Float.floatToIntBits(1f) - 1;
    float val = Float.intBitsToFloat(repr);
    for (long i = 1; i <= -(long)Integer.MIN_VALUE; i++) {
        if ((int) (val * i) == i) {
            System.out.println("FOUND VALUE: " + i);
        }
        if ((int) (val * -i) == -i) {
            System.out.println("FOUND VALUE: " + -i);
        }
        if (i % 100000000 == 0) {
            System.out.println("Done: " + (double)i/Integer.MAX_VALUE);
        }
    }
    // nothing printed
}
于 2012-04-27T22:15:56.827 に答える