2009-10-31 35 views
47

Điều này thật kỳ lạ và tôi không thể thấy tại sao điều này xảy ra. Trong chu trình foreach, tôi đang lặp qua bộ sưu tập lớp A và cho mỗi lớp, tôi gọi phương thức Count(), trong đó các số r1r2 được tạo từ phạm vi [-1,1]. Vấn đề là Random.Next trả về cùng một số "ngẫu nhiên" cho mỗi trường hợp. Khi kết quả cho trường hợp đầu tiên là 0 và -1, các kết quả tương tự sẽ được trả về từ các trường hợp sau. Làm ơn, bạn có thể cho tôi biết tại sao điều này xảy ra? Ngoài ra, tôi không thể nhận được các kết quả khác nhau trong mỗi cá thể lớp A. Đây là mã:Random.Next trả về luôn có cùng giá trị

class a 
{ 
Random rnd = new Random(); 
private void Count() 
{ 
    int r1 = rnd.Next(-1, 1); 
    int r2 = rnd.Next(-1, 1); 
} 
} 
class b 
{ 
List<a> listofA=new list<a>(); 
foreach (a ACLASS in listofA) 
{ 
    ACLASS.Count(); 
} 
} 

Trả lời

94

Vấn đề là bạn đang tạo trường hợp của lớp học quá gần đúng giờ.

Khi bạn tạo đối tượng Random, nó được tạo hạt với giá trị từ đồng hồ hệ thống. Nếu bạn tạo Random trường hợp quá gần trong thời gian, tất cả chúng sẽ được gieo giống với cùng một chuỗi ngẫu nhiên.

Tạo một đối tượng Random duy nhất và chuyển tham chiếu đến hàm tạo khi bạn tạo các thể hiện của lớp "a", thay vì tạo một đối tượng Random cho mỗi cá thể "a".

+1

Tôi quên là tốt, tôi đã từng có cùng một vấn đề trở lại trong ngày làm Bingo Thùng cho một câu lạc bộ, và trở lại sau đó, tôi đã sử dụng thủ thuật tồi tệ nhất từng được biết đến với con người: Tạm dừng chủ đề cho 2 Cô Thiếu kinh nghiệm và điên rồ ... Đủ điên, tôi có một lớp tạo tên ngẫu nhiên với khai báo Ngẫu nhiên tĩnh trên đầu của tất cả mọi thứ. –

5

Bạn bao gồm một trường hợp ngẫu nhiên cho mỗi cá thể A. Có vẻ như tất cả chúng đều có cùng giá trị mặc định. Bạn có thể muốn tạo một ngẫu nhiên tĩnh cho tất cả các cá thể A và sử dụng nó lặp đi lặp lại, hoặc cung cấp một giá trị giống cho thể hiện Random() trong hàm tạo A.

8

Bạn đang tạo một phiên bản mới Random rất gần nhau (vòng lặp của bạn rất chặt chẽ) để mỗi cá thể có hiệu quả sử dụng cùng một giá trị hạt giống.

Cách tiếp cận tốt hơn là tạo một phiên bản và chuyển cho phương thức Count của bạn.

Bạn problably biết chút sau này, nhưng tôi sẽ đưa nó ở đây cho đầy đủ:

Các MSDN có các chi tiết về vấn đề này, nhưng về cơ bản vấn đề của bạn là Random.Next phương pháp mà bạn đang sử dụng tạo ra:

Một số nguyên có dấu 32 bit lớn hơn hoặc bằng minValue và nhỏ hơn maxValue; có nghĩa là, phạm vi giá trị trả về bao gồm minValue nhưng không phải maxValue. Nếu minValue bằng maxValue, minValue được trả về.

vì điều này các cuộc gọi của bạn sẽ trở về -1 hoặc 0.

7

Sử dụng một, tĩnh bộ tạo số ngẫu nhiên duy nhất cho tất cả các trường của lớp.

class a 
{ 
    private static Random rnd; 
    static a() { 
     rnd = new Random(); 
    } 
    private void Count() 
    { 
    int r1 = rnd.Next(-1, 2); 
    int r2 = rnd.Next(-1, 2); 
    } 
} 

Lưu ý sự thay đổi để cung cấp cho bạn các số trong phạm vi -1,1 chứ không phải -1,0

+0

tôi nghĩ rằng với phạm vi này nó cũng có thể trở lại 1 và họ chỉ muốn 0 và -1? – Lucas

+0

@Svante đã chỉnh sửa câu hỏi để làm cho khoảng thời gian mở phù hợp với mẫu mã.Câu hỏi ban đầu đã chỉ định khoảng thời gian đóng, mặc dù không sử dụng ngôn ngữ chính xác. Tôi nghĩ rằng mã không chính xác và tôi sẽ khôi phục câu hỏi để chỉ định khoảng thời gian đã đóng. – tvanfosson

+0

@tvanfosson Bạn có thể cho tôi biết lý do tại sao tính năng này hoạt động không? Tôi không hiểu làm thế nào làm cho statics này mang lại cho bạn sự ngẫu nhiên. Tôi biết nó hoạt động, nhưng không phải lý do tại sao. Chúng vẫn còn rất gần. Cảm ơn. – johnny

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