Tôi đã viết một mô phỏng động vật ăn thịt nhỏ trong Java. Thậm chí nếu các quy định là khá phức tạp và kết thúc trong một hệ thống hỗn loạn các kỹ thuật sử dụng rất đơn giản:Java không xác định?
- arithmetics và quyết định về các kiểu dữ liệu cơ bản
- không thư viện bên ngoài
- không hệ thống bên ngoài có
- không đồng thời xảy ra
- không sử dụng thời gian hiện tại hoặc ngày
Vì vậy, tôi nghĩ khi khởi tạo hệ thống với các thông số giống hệt nhau nên xuất kết quả giống hệt nhau, nhưng nó không và tôi tự hỏi tại sao.
Một số suy nghĩ về điều đó: Ứng dụng của tôi sử dụng Random
s, nhưng đối với thử nghiệm đó, tôi khởi tạo tất cả với một giá trị nhất định, theo hiểu biết của tôi, chúng sẽ tạo cho mỗi lần chạy cùng một đầu ra theo cùng một thứ tự.
Tôi đang lặp lại thông qua Set
giây và tôi biết rằng đơn đặt hàng Set
được lặp lại không được xác định. Nhưng tôi không thấy bất kỳ lý do tại sao một Set
được điền vào cùng một thứ tự với các giá trị giống nhau sẽ hoạt động khác nhau trong một số lần chạy. Phải không?
Tôi đang sử dụng rất nhiều float
s. Các kiểu dữ liệu trong đó 1 + 1 = 1.9999999999725 luôn luôn là nghi ngờ đối với tôi, nhưng tôi thậm chí nếu hành vi của họ là lạ với tôi, nó phải luôn luôn là cùng một lạ. Phải không?
Bộ sưu tập rác không phải là xác định, nhưng miễn là tôi không dựa vào destructors tôi nên được an toàn.
Như đã nói ở trên, không có đồng thời và không có kiểu dữ liệu tùy thuộc vào thời gian thực tế sử dụng.
Tôi không thể sao chép hành vi đó trong một ví dụ đơn giản. Nhưng đi qua mã của tôi, tôi không thể thấy bất cứ điều gì có thể không đoán trước được. Vì vậy, có bất kỳ giả định của tôi ở trên sai? Bất kỳ ý tưởng những gì tôi có thể bị mất tích?
Dưới đây là một thử nghiệm để xác minh giả thuyết của tôi:
public static void main(String[] args) {
Random r = new Random(1);
Set<Float> s = new HashSet<Float>();
for (int i = 0; i < 1000000; i++) {
s.add(r.nextFloat());
}
float ret = 1;
int cnt = 0;
for (Float f : s) {
float multiply = 0.3f;
if (cnt++ % 2 == 0) {
multiply = 0.7f;
}
float f2 = (f * multiply);
ret += f2;
}
System.out.println(ret);
}
Nó là kết quả luôn trong 242.455,25 cho tôi.
Chức năng thời gian? – Mysticial
Khi bạn nói rằng bạn khởi tạo dữ liệu ngẫu nhiên của bạn, bạn có nghĩa là bạn sử dụng một hạt giống? – tjameson
Điều này nghe có vẻ thú vị. Chúng tôi có thể xem mã của bạn không? – kol