2013-08-04 74 views
5

Mã này đóng vai trò như in mong đợi "Average Số Chạy: 0,99864197"Gần trống Java Ví-Vòng hành động kỳ lạ

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

    } 
} 

Mã này rằng nên in các con số chính xác như nhau, nhưng thay vào đó nó in một số âm ngẫu nhiên .

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

    } 
} 

Có một số tối ưu hóa xảy ra trong java cho vòng lặp không?

Ghi chú:

  1. Tôi đang sử dụng jdk1.6.0_45.
  2. Trong sử dụng bình thường, ngẫu nhiên mới sẽ có hạt giống tốt hơn.
  3. phút và tối đa có thể là bất kỳ số nào.
+0

Tôi dường như nhớ rằng đây là một bản sao, nhưng tôi nghi ngờ tôi sẽ gặp khó khăn trong việc tìm kiếm nó. Tôi nghĩ * đó là lỗi JIT trong 1.6 đã được sửa trong Java 7. Bạn có thể thử trên Java 7 không? –

+0

@ JonSkeet Tôi chỉ thử điều này trong Java 7, và điều này đã làm việc hoàn hảo. – tbodt

+0

Chạy mã trên ju 7u25 dường như để khắc phục vấn đề, do đó, nó dường như là một lỗi trong Java 6. Đó là loại hút kể từ một khá nhiều người trong cộng đồng Minecraft, dường như không biết làm thế nào để cập nhật và mã này là một phần của một trò chơi-Sửa đổi Tôi đã làm việc trên ... Cũng @Jon Skeet bạn có thể gửi một câu trả lời vì vậy tôi có thể đánh dấu nó như được chấp nhận? –

Trả lời

1

Tôi tin rằng đây là một lỗi trong việc xử lý JIT của các vòng rất chặt chẽ trong một số phiên bản của Java 6. Nó có thể hoặc là bug 6196102 hoặc lỗi 6357124.

Việc cập nhật lên Java 7 sẽ hoạt động, mặc dù tôi đánh giá cao điều đó không giúp ích nhiều cho tình huống của bạn. Bạn có thể thấy rằng việc thêm một "có vẻ như nó không phải là một no-op, nhưng làm một cái gì đó bạn không quan tâm về" phương pháp gọi trong vòng lặp của bạn sửa chữa vấn đề quá. Ví dụ, bạn có thể tổng hợp tất cả các giá trị của i và in nó vào một số nhật ký chẩn đoán sau đó sẽ bị bỏ qua.

0

Nó hoạt động tốt ở đây trên openjdk 1.7.0_25 fedora-2.3.10.4.fc19-x86_64. Bạn nên cập nhật phiên bản Java của mình hoặc đảm bảo rằng sự cố của bạn thực sự là với mã như đã nêu.