2013-08-04 7 views
5

Dieser Code dient als erwartet Druck „Durchschnittliche Anzahl der Pisten: 0,99864197“in der Nähe leer Java For-Schleife wirkt seltsam

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); 

    } 
} 

Dieser Code, der die gleiche genaue Zahl gedruckt werden soll, sondern druckt er eine zufällige negative Zahl .

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); 

    } 
} 

Gibt es eine Optimierung, die in Java für Schleifen geschieht?

Hinweise:

  1. Ich verwende jdk1.6.0_45.
  2. Im normalen Einsatz hätte der neue Random einen besseren Samen.
  3. min und max sollte eine beliebige Zahl sein können.
+0

Ich erinnere mich, dass dies ein Duplikat ist, aber ich vermute, dass ich Schwierigkeiten haben werde, es zu finden. Ich * denke * es ist ein JIT-Bug in 1.6, der in Java 7 behoben wurde. Können Sie Java 7 ausprobieren? –

+0

@JonSkeet Ich habe das gerade in Java 7 versucht, und das hat perfekt funktioniert. – tbodt

+0

Das Ausführen des Codes auf jre 7u25 scheint das Problem zu beheben, also scheint es ein Fehler in Java 6 zu sein. Diese Art von saugt seit einer ganzen Handvoll Leute in der Minecraft-Community, scheint nicht zu wissen, wie man update und Dieser Code ist Teil einer Spielmodifikation an der ich gearbeitet habe ... Auch @Jon Skeet kannst du eine Antwort posten, damit ich sie als akzeptiert markieren kann? –

Antwort

1

Ich glaube, das 6. Es kann ein Fehler in der JIT Umgang mit sehr engen Schleifen in einigen Versionen von Java sein 6357124 entweder bug 6196102 oder Fehler sein.

Aktualisierung auf Java 7 sollte funktionieren, obwohl ich weiß, dass das nicht viel in Ihrer Situation hilft. Sie können feststellen, dass das Hinzufügen eines "sieht aus wie es ist kein No-Op, aber macht etwas, was Sie nicht interessiert" Methode Aufruf innerhalb Ihrer Schleife behebt das Problem zu. Zum Beispiel könnten Sie alle Werte von i summieren und diese anschließend in ein Diagnoseprotokoll drucken, um ignoriert zu werden.

0

Es funktioniert gut hier auf openjdk 1.7.0_25 fedora-2.3.10.4.fc19-x86_64. Sie sollten Ihre Java-Version aktualisieren oder sicherstellen, dass Ihr Problem tatsächlich mit dem angegebenen Code zusammenhängt.

Verwandte Themen