2013-08-04 14 views
5

このコードは、予想印刷として働く「ランの平均数:0.99864197」は、forループは奇妙作用

import java.util.Random; 

public class A { 
    public static void main(String[] args) { 
     int min = -30; 
     int max = 1; 
     test(min, max); 
    } 
    static void test(int min, int max){ 
     int count = 0; 
     Random rand = new Random(0); 
     for(int j = 0; j < 2097152; j++){ 
      int number = min + rand.nextInt(max-min+1); 
      for(int i = 0; i < number; ++i) { 
       System.out.print(""); 
       count++; 
      } 
     } 
     System.out.println("Average Number of Runs: " + count/65536F); 

    } 
} 

同じ正確な数を印刷、代わりに、それはランダムな負の数を印刷する必要があり、このコード。

import java.util.Random; 

public class A { 
    public static void main(String[] args) { 
     int min = -30; 
     int max = 1; 
     test(min, max); 
    } 
    static void test(int min, int max){ 
     int count = 0; 
     Random rand = new Random(0); 
     for(int j = 0; j < 2097152; j++){ 
      int number = min + rand.nextInt(max-min+1); 
      for(int i = 0; i < number; ++i) { 
       //System.out.print(""); 
       count++; 
      } 
     } 
     System.out.println("Average Number of Runs: " + count/65536F); 

    } 
} 

java forループで発生する最適化はありますか?

注:

  1. 私はjdk1.6.0_45使用しています。
  2. 通常の使用では、新しいランダムはより良いシードを持ちます。
  3. minとmaxは任意の数値にする必要があります。
+0

私はこれが重複していることを覚えているようですが、私はそれを見つけるのが難しいと思っています。私は*それはJavaの7で修正された1.6のJITバグだと思う。あなたはJava 7で試すことができますか? –

+0

@JonSkeet私はJava 7でこれを試しましたが、これは完全に機能しました。 – tbodt

+0

jre 7u25でコードを実行すると問題が解決されたようですので、Java 6のバグと思われます。この種の問題は、minecraftコミュニティの人のほんの一部であるため、このコードは私が取り組んできたGame-Modificationの一部です...また、@ Jon Skeetはあなたが回答を投稿できるので、私は受け入れられたとマークすることができますか? –

答えて

1

私はそれbug 6196102やバグ6357124のいずれであってもよく、これはJavaの6の一部のバージョンでは非常にタイトなループのJITの取り扱いにバグであると信じます。

Java 7へのアップデートはうまくいくはずですが、あなたの状況ではあまり役に立ちません。ループの中でメソッド呼び出しを気にしなくても、「ノーオペレーションではないように見えますが」という追加を加えると、問題が修正されることがあります。たとえば、iのすべての値を合計し、それを後で診断ログに出力して無視することができます。

0

openjdk 1.7.0_25 fedora-2.3.10.4.fc19-x86_64で正常に動作します。 Javaバージョンを更新するか、問題が実際に記載されているコードであることを確認する必要があります。