2012-04-27 15 views
0

1に非常に近い浮動小数点数にint> 0を掛けると、それは1と解釈されることがあります。掛け算時に0.999 ... 1に丸められますか?

つまり、Math.random()が可能な最高の結果1.0未満のステップ)、

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

は8または7ですか?

実用例えば

、この頻繁に使用される構築物は、境界エラーのうちの指標を与えることができます:

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

私は、JavaとActionScript 3のための答えでは特に興味が、私は彼らがすべて使用と仮定します浮動小数点演算のための同じルール、および任意のプラットフォームに対する答えが有用である。

更新:私はすでに答えを受け入れていますが、ActionScript 3ではこれが間違っているとは思わないことを確認しています。同僚は一度間違っていると報告したので、質問。

+3

あなたはすでに答えを受け入れましたか? – Paulpro

+2

ええと、「私はすでに回答を受け入れていますが」とは何ですか? –

+0

どういう意味ですか? –

答えて

1

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

0

JavaのMath.random(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html)を使用すると、値は0.0以上になる可能性があります。 1.0未満である。

値0.999999の値を一つのテストを使用した(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は1,2,3,4,5,7または6のような他の値を返すことができます。これはMath.randomに返される値によって異なります。あなたは実際に速い網羅的な探索が、これはフロートを持つ任意の32ビット整数のために起こることができないことを示すことができるサンプルコード

+0

'frac1'の実際の値をチェックしますか? –

0

を実行し、これをテストすることができます。

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 
} 
関連する問題