2010-02-25 67 views
9

tôi đã và đang làm một số thử nghiệm trên lớp ngẫu nhiên và tôi đã sử dụng đoạn mã sau:Làm thế nào là ngẫu nhiên Random.Next()?

while (x++ <= 5000000) 
     { 
      y = rnd.Next(1, 5000000); 
      if (!data.Contains(y)) 
       data.Add(y); 
      else 
      { 
       Console.WriteLine("Cycle {2}: Repetation found for number {0} after {1} iteration", y, x, i); 
       break; 
      } 
     } 

tôi liên tục thay đổi giới hạn rnd max (tức là 5000000) và tôi đã thay đổi số lần lặp lại và tôi đã nhận như sau kết quả:

1) if y = rnd.Next(1, 5000) : The average is between 80 to 110 iterations 
2) if y = rnd.Next(1, 5000000) : The average is between 2000 to 4000 iterations 
3) if y = rnd.Next(1, int.MaxValue) : The average is between 40,000 to 80,000 iterations. 

Tại sao tôi nhận được số trung bình này, tức là 10 lần tôi đã kiểm tra cho mỗi giá trị, 80% thời gian tôi nhận được trong phạm vi trung bình này. Tôi không nghĩ chúng ta có thể gọi nó là ngẫu nhiên.

Tôi có thể làm gì để có được số ngẫu nhiên.

+4

Nó được gọi là giả ngẫu nhiên vì một lý do. –

+4

ngẫu nhiên không có nghĩa là 'duy nhất'. – nos

+18

Chúc mừng bạn đã khám phá ra nghịch lý sinh nhật. (http://en.wikipedia.org/wiki/Birthday_problem) – kennytm

Trả lời

30

Bạn không kiểm tra chu trình. Bạn đang thử nghiệm trong bao lâu để có được một số ngẫu nhiên bạn đã có trước đây. Đó là hoàn toàn khác nhau. Các số liệu của bạn được phát hiện để thử nghiệm mất bao lâu để có được một số ngẫu nhiên mà bạn đã có trước đây. Tìm trong wikipedia dưới "nghịch lý sinh nhật" cho một biểu đồ xác suất bị va chạm sau một số lần lặp nhất định.

Thật trùng hợp, tuần trước tôi đã viết một bài viết blog về chủ đề chính xác này. Nó sẽ phát hành vào ngày 22 tháng 3; see my blog sau đó để biết chi tiết.

Nếu những gì bạn muốn để kiểm tra là độ dài chu kỳ của một bộ tạo số giả ngẫu nhiên thì bạn cần phải tìm kiếm không phải là một số bạn đã có trước đó, nhưng đúng hơn, một dài chính xác chuỗi số mà bạn đã có trước đây. Có một số cách thú vị để làm điều đó, nhưng nó có lẽ dễ dàng hơn cho tôi để chỉ cho bạn biết: chiều dài chu kỳ của Random là một vài tỷ, vì vậy bạn không có khả năng viết một chương trình phát hiện ra thực tế đó. Bạn sẽ phải lưu trữ số số.

Tuy nhiên, độ dài chu kỳ không phải là thước đo duy nhất về chất lượng của trình tạo số giả ngẫu nhiên. Hãy nhớ rằng, PRNG là không ngẫu nhiên, chúng là có thể dự đoán được và do đó bạn phải suy nghĩ kỹ về số liệu của bạn cho "ngẫu nhiên" là gì.

Cung cấp cho chúng tôi thêm chi tiết: tại sao bạn quan tâm ngẫu nhiên "ngẫu nhiên" là gì? Ứng dụng bạn đang sử dụng nó cho rằng bạn quan tâm? Những khía cạnh ngẫu nhiên nào quan trọng đối với bạn?

+0

+1 @Eric: Bạn đã điền upp blog của mình trước khi phát hành chưa? Thật buồn cười. – Zano

+6

@Zano: Vâng, tôi viết cả đống bài báo cùng một lúc và sau đó đặt chúng lên để phát trực tiếp hai lần một tuần. Tôi đi trước khoảng hai tháng tại bất kỳ thời điểm nào. Raymond Chen xuất bản như năm hay mười lần một tuần và có vài năm * giá trị trong hàng đợi của anh ấy; Tôi không biết anh ấy làm thế nào! –

+0

Hehe thật buồn cười. Nhưng không phải các bài viết đã lỗi thời, nếu bạn làm nó nhiều năm trước? Ví dụ: phiên bản .NET hoặc C# mới sẽ hoạt động khác, v.v. –

2

Máy tính không thể tạo số ngẫu nhiên thực. nếu bạn cần một số ngẫu nhiên thực sự (David cho bạn lựa chọn tốt nhất từ ​​khung net dot) bạn cần một nguồn ngẫu nhiên bên ngoài.

+1

Tôi thích cách random.org sử dụng tiếng ồn trong nhiễu loạn khí quyển. –

3

Bạn đang đánh giá ngẫu nhiên bằng các cặp lặp lại, đây không phải là thử nghiệm tốt nhất cho tính ngẫu nhiên. Việc lặp lại bạn thấy giống như nghịch lý sinh nhật: http://en.wikipedia.org/wiki/Birthday_problem, trong đó sự kiện lặp lại có thể xảy ra với kích thước mẫu nhỏ nếu bạn không tìm kiếm sự kiện cụ thể.

15

Bạn giả sử rằng tính ngẫu nhiên sẽ tốt hơn nếu các số không lặp lại. Điều đó không đúng.

Tính ngẫu nhiên thực sự không có bộ nhớ. Khi bạn chọn số tiếp theo, cơ hội để có được cùng một số lần nữa cũng cao như bất kỳ số nào khác trong phạm vi.

Nếu bạn lăn một con xúc xắc và nhận được sáu, sau đó cuộn lại con xúc xắc, sẽ không có ít cơ hội nhận lại sáu lần nữa. Nếu bạn xảy ra để có được hai sáu trong một hàng, điều đó không có nghĩa là con xúc xắc bị hỏng.

Sự ngẫu nhiên trong lớp Ngẫu nhiên tất nhiên là không hoàn hảo, nhưng đó không phải là những gì bài kiểm tra của bạn tiết lộ. Nó chỉ đơn giản là cho thấy một penomenon mà bạn nhận được với tất cả các máy phát điện số ranom, ngay cả khi thực sự tạo ra các số ngẫu nhiên thực sự và không chỉ là số ngẫu nhiên giả.

+0

+1 cho con xúc xắc bị hỏng –

+0

+1 rất được giải thích – Bhaskar

+0

Thực tế, nó có thể. Tôi có xúc xắc 10 mặt có chiều cao gấp 8,9,0 lần so với các con số khác. Họ là tuyệt vời cho Marvel Super Heroes, nhưng xấu cho các trò chơi khác mà muốn số thấp hơn. I E. Dice CÓ THỂ bị hỏng. – PRMan

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