2011-10-29 42 views
6

Tôi đang làm việc trên thuật toán tạo địa hình trơn tru trong C# và sử dụng XNA để hiển thị dữ liệu.Đối tượng ngẫu nhiên không xử lý trong C#

Tôi đang tạo nó để tạo ra một điểm mới giữa mỗi điểm trên mỗi lần lặp, với chiều cao ngẫu nhiên giữa hai điểm. Điều này làm việc OK, và tôi đã thiết lập nó để lặp lại lần thứ hai nó chọn một điểm ngẫu nhiên như trong slide hai, thay vì cố gắng tạo một điểm mới giữa các điểm trên cùng một trục.

gì đang xảy ra là vòng lặp được sử dụng giá trị ngẫu nhiên cùng từ lặp đi lặp lại theo thời gian: http://i.stack.imgur.com/UmWr7.png

Đây không phải là lý tưởng rõ ràng, vì nó không phải là một thế hệ ngẫu nhiên thích hợp.

Nếu tôi sử dụng một Thread.Sleep(20) sau mỗi thế hệ điểm nó hoạt động một cách chính xác: http://i.stack.imgur.com/KziOg.png

Tôi không muốn phải sử dụng Sleep workaround if possible vì nó là rất chậm, và tôi muốn sử dụng này trong thời gian thực. Tôi khá chắc chắn điều này có cái gì để làm với thu gom rác C#.

Đây là điểm Nhận của tôi Mã

Random r = new Random(); 
int x = (p1.X + p2.X)/2; 
int y; 
if (!initial) 
     y = r.Next(Math.Min(p1.Y, p2.Y), Math.Max(p1.Y, p2.Y)); 
else 
     y = r.Next(Math.Min(p1.Y, p2.Y) - Game1.screenHeight/2, Math.Max(p1.Y, p2.Y) + Game1.screenHeight/2); 
return new Point(x, y); 

Là thu gom rác thải là một phần của vấn đề này?

Bất kỳ đề xuất hoặc giải pháp nào để giải quyết vấn đề này ??

Trả lời

10

Có thể bạn đang tạo một đối tượng ngẫu nhiên mới trong một vòng lặp.

for (/* ... */) { 
    int x = new Random().Next(); // Don't do this! 
    // ... 
} 

Cố gắng tạo chỉ một trường hợp ngẫu nhiên khi khởi động chương trình, sau đó sử dụng lại. Nếu bạn có nhiều luồng, thì bạn có thể sử dụng một đối tượng ngẫu nhiên cho mỗi luồng.

+0

Ahh không thể tin rằng tôi không thấy điều này. Cảm ơn rất nhiều vì sự giúp đỡ. – FrenchyNZ

6

Có vẻ như bạn đang tạo một phiên bản mới Random trên mỗi lần lặp . Điều đó sẽ lấy hạt giống của nó từ thời điểm hiện tại - vì vậy mà không ngủ, bạn kết thúc với cùng một giá trị lặp đi lặp lại; với một giấc ngủ bạn sẽ nhận được một hạt giống khác nhau.

Câu trả lời là để tái sử dụng mộtRandom dụ xuyên suốt chương trình của bạn - nhưng lưu ý đến thực tế là Random không phải là thread-safe. Nếu tất cả công việc của bạn đang được thực hiện trong chuỗi giao diện người dùng, bạn sẽ ổn - nhưng nếu không bạn có thể muốn sử dụng một trong các cách tiếp cận tôi đã cung cấp trong số article about Random của mình (nói về vấn đề này nhiều hơn).


Và vâng, bây giờ mà bạn đã đăng mã mà thực sự là như vậy.

+0

Cảm ơn thông tin về ngẫu nhiên không phải là "chủ đề an toàn" cũng rất hữu ích – FrenchyNZ

Các vấn đề liên quan