2010-09-10 49 views
5

Tôi đang cố gắng chọn ngẫu nhiên từ ví dụ: 4 số. Tôi cần so sánh xác suất của 2 thuật toán này.Số ngẫu nhiên xác suất

1 #

   int a = random.Next(0, 4); 

       if (a = 0) 
        statement1 
       if (a = 1) 
        statement2 
       if (a = 2) 
        statement3 
       if (a = 3) 
        statement4 

2 #

   int a = random.Next(0, 1000) 

       if (a < 250) 
        statement1 
       if (a >= 250 && a < 500) 
        statement2 
       if (a >= 500 && a < 750) 
        statement3 
       if (a >= 750) 
        statement4 

Tôi có phải không nếu tôi nghĩ rằng nó là như nhau? Xác suất của statement1 trong mã đầu tiên là 1/4 và trong mã thứ hai nó là 250/1000 vì vậy nó cũng là 1/4. Nhưng ai đó đã nói với tôi khi tôi sử dụng nhiều số ngẫu nhiên lớn hơn như trong mã số 2 thì nó chính xác hơn về mặt thống kê. Tôi đã thực hiện dự án lặp lại nhiều lần những mã đó, nhưng tôi không chắc rằng nó cho tôi thấy một số kết quả.

+1

Side lưu ý, bạn có thể muốn thêm mệnh đề khác để IFS của bạn. Không cần phải đánh giá tất cả 4 tùy chọn khi bạn đã thành công. –

Trả lời

3

Chúng chính xác tương đương (ngoại trừ thực tế là người đầu tiên sẽ không biên dịch do sử dụng = thay vì == trong các mệnh đề if).

Để chứng minh điều này, hãy xem triển khai Random.Next(int, int). Với giá trị của bạn, Random.Next(0, 4)

(int) (Random.Sample() * 4) 

Random.Next(0, 1000)

(int) (Random.Sample() * 1000) 

, nơi Random.Sample() là một phương pháp riêng mà trả về một ngẫu nhiên đôi.

Nó bây giờ sẽ được dễ dàng để thấy rằng Random.Next(0, 4) sẽ trở lại 0 chính xác khi Random.Next(0, 1000) sẽ trả về một con số nằm giữa 0 và 250.

+0

Nó có thể biên dịch, nhưng chắc chắn nó sẽ không làm những gì bạn muốn. – Live

+2

@Live, điều đó không đúng trong C#. Nó sẽ không biên dịch và sẽ tạo ra lỗi trình biên dịch: "không thể chuyển đổi hoàn toàn kiểu 'int' thành 'bool'" –

+0

Tuyệt vời cho cách tiếp cận chứng minh. –

2

số giả ngẫu nhiên nên được phân bố đều không có vấn đề gì phạm vi là. Nếu, trong ví dụ thứ hai của bạn, nếu bạn chỉ chọn 4 bit cuối cùng (a & 3), bạn sẽ nhận được cùng phân phối như thể bạn chọn 4 bit tiếp theo với (a>>2) & 3. I E. những gì bạn đang thực hiện thuật toán trong ví dụ thứ hai sử dụng các phạm vi, là loại bỏ nhiều thông tin mà trình tạo ngẫu nhiên đã cung cấp cho bạn. Bạn sẽ không còn "ngẫu nhiên" với phạm vi rộng hơn.

Có nói điều này, các nhà phát triển giả tạo không có idiosyncracies của họ, nhưng trừ khi bạn nghiêm túc về điều này nó không đáng lo ngại về!

0

Sự phân bố đồng đều và thật dễ dàng để xác minh:

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var random = new Random(); 
     const int iterations = 10000000; 

     var hits1 = 1.0 * Enumerable.Range(1, iterations) 
            .Select(i => random.Next(0, 4)) 
            .Where(i => i == 0).Count(); 
     Console.WriteLine(hits1/iterations); 

     var hits2 = 1.0 * Enumerable.Range(1, iterations) 
            .Select(i => random.Next(0, 1000)) 
            .Where(i => i < 250) 
            .Count(); 
     Console.WriteLine(hits2/iterations); 
    } 
} 
-1

xét nghiệm của tôi như sau

Out of một 10K vòng 2 bài kiểm tra được chạy với một loạt 1-4 và một loạt 1-1000, heres kết quả

1-4

1 > 2484 times 
    2 > 2519 times 
    3 > 2511 times 
    4 > 2487 times 

0 - 1000

1 - 250 > 2421 times 
    250 - 500 > 2531 times 
    500 - 750 > 2529 times 
    750 - 1000 > 2490 times 

kết luận của tôi là chúng không khác biệt gì hết, bạn phải vào ma trận và có quyền kiểm soát việc tạo số ngẫu nhiên và vv.

Lưu ý: các thử nghiệm của tôi đã được thực hiện với PHP và mã nguồn bên dưới.


<?php 

$first = array(1=>0,2=>0,3=>0,4=>0); 
$second = array('0 - 250' => 0, '250 - 500' => 0, '500 - 750' => 0,'750 - 1000' => 0); 

for($i=0;$i<=10000;$i++) //10K 
{ 
    //First 
    $f_number = rand(1,4); 
    switch($f_number) 
    { 
     case 1: $first[$f_number]++; break; 
     case 2: $first[$f_number]++; break; 
     case 3: $first[$f_number]++; break; 
     case 4: $first[$f_number]++; break; 
    } 

    //Second 
    $s_number = rand(1,1000); 
    if($s_number < 250) $second['0 - 250']++; 
    if($s_number > 250 && $s_number < 500) $second['250 - 500']++; 
    if($s_number > 500 && $s_number < 750) $second['500 - 750']++; 
    if($s_number > 750) $second['750 - 1000']++; 
} 

var_dump($first,$second); 
?> 
+0

-1 Đó là một giả định quá lớn để nói rằng việc triển khai thực hiện số ngẫu nhiên php giống hệt với việc sử dụng C# –

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