2008-11-17 41 views
8

Tôi đang sử dụng đối tượng System.Random được khởi tạo với một hạt giống cố định tất cả mặc dù ứng dụng. Tôi đang gọi phương thức NextDouble và sau một thời gian, tôi nhận được kết quả là 0.0.System.Random giữ trả về cùng một giá trị

Có biện pháp khắc phục nào cho điều này không, có ai khác đã gặp phải vấn đề này không?

CHỈNH SỬA: Tôi có một hạt giống cho toàn bộ lần chạy được đặt thành 1000 cho mục đích sử dụng. Random.NextDouble được gọi là vài trăm nghìn lần. Nó là một ứng dụng tối ưu hóa và có thể chạy trong vài giờ, nhưng điều này thực sự xảy ra sau 10 phút thực hiện. Gần đây tôi đã thêm một số cuộc gọi ngẫu nhiên vào ứng dụng.

+0

Bạn có thể xây dựng trên "một thời gian" không? Chúng ta đang nói một giờ, hay vài ngày của hàng triệu con số? Tôi không tưởng tượng bạn đã gặp vấn đề trong chức năng thực tế, nhưng nếu bạn ở trong lãnh thổ chưa bao giờ được kiểm tra hoặc lên kế hoạch, tôi sẽ không giảm giá ngay lập tức. –

+0

có thể trùng lặp của [Trình tạo số ngẫu nhiên chỉ tạo ra một số ngẫu nhiên] (http://stackoverflow.com/questions/767999/random-number-generator-only-generating-one-random-number) –

Trả lời

16

Trình tạo số ngẫu nhiên trong .NET không phải là luồng an toàn. nhà phát triển khác đã nhận thấy hành vi tương tự, và một giải pháp là như sau (từ http://blogs.msdn.com/brada/archive/2003/08/14/50226.aspx):

class ThreadSafeRandom 
{ 
    private static Random random = new Random(); 

    public static int Next() 
    { 
     lock (random) 
     { 
      return random.Next(); 
     } 
    } 
}
+1

Nó được gọi là từ các chủ đề khác nhau! –

+1

Có vẻ như bạn cũng có thể áp dụng thuộc tính [ThreadStatic] cho thể hiện Ngẫu nhiên của mình, nếu đó là biến tĩnh trong ứng dụng của bạn. –

8

Bạn có thường xuyên gieo hạt ngẫu nhiên không? Nó chỉ nên được thực hiện một lần khi bắt đầu chương trình.

Và một khi được gieo với một giá trị nhất định, nó sẽ luôn tạo ra cùng trình tự chính xác.

+0

Tôi đang gieo hạt giống một lần. –

1

hãy xem số http://msdn.microsoft.com/en-us/library/system.random.aspx nó sẽ giải thích lý do tại sao bạn nhận được cùng một giá trị.

+0

Tùy chọn Ngẫu nhiên (DateTime.Now.Second) mới được giới hạn ở 60 giá trị khác nhau. –

+0

Tại sao không chỉ sử dụng hàm tạo mặc định và để nó chọn một hạt giống cho bạn? Đảm bảo là một ý tưởng tốt hơn so với _these_. – Domenic

+0

yep ok, được thay đổi thành ít ngu ngốc. – Hath

2

Tomas, tôi chạy vào trong này "lỗi" trước và giải pháp đối với tôi là để làm cho module- biến _rnd cấp:

Private Shared _rnd As System.Random() 
Public Shared Function RandRange(ByVal low As Integer, ByVal high As Integer) As Integer 
    If _rnd Is Nothing Then 
     _rnd = New System.Random() 
    End If 
    Return rnd.Next(low, high) 
End Function 
2

Những người khác đã làm tốt công việc giải thích và cung cấp giải pháp.

Dù sao, một câu hỏi tương tự đã được trả lời trước bởi Erik, check it out:

Pseudo Random Generator with same output

Bạn cũng có được nhiều câu hỏi và câu trả lời liên quan đến chủ đề (Random Number Máy phát điện) tại địa chỉ:

Stackoverflow.com random-number-generator

Gene

P.S. Đây chỉ là để bổ sung câu trả lời được chấp nhận.

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