2010-09-22 64 views

Trả lời

11
bool nextBool(double probability) 
{ 
    return (rand()/(double)RAND_MAX) < probability; 
} 

hoặc (sau khi nhìn thấy phản ứng khác)

bool nextBool(double probability) 
{ 
    return rand() < probability * ((double)RAND_MAX + 1.0); 
} 
+0

+1 Tuyệt vời, cảm ơn (trên cùng). –

+0

Thứ hai có thể thực sự nhanh hơn. Chúng giống nhau về mặt toán học. – Colin

+4

Điều đó cần phải là 'xác suất * (RAND_MAX + 1)' - nếu không, chuyển giá trị của '1.0' là' xác suất' sẽ dẫn đến hàm trả về 0 đôi khi. – caf

1

Bạn có nghĩa là tạo ra một biến ngẫu nhiên do đó p (1) = p và p (0) = (1-p)?

Nếu có, hãy so sánh đầu ra của rand() đến p*RAND_MAX.

0

Các máy phát điện sau không nên thiên vị, rand nhất định() một cách hiệu quả thống nhất và độc lập:

bool nextBool(double probability) 
{ 
    double p_scaled = probability * (RAND_MAX+1) - rand(); 
    if (p_scaled >= 1) return true; 
    if (p_scaled <= 0) return false; 
    return random_bool(p_scaled); 
} 

Lưu ý, rằng trong khi chức năng là đệ quy,

  1. probabil ity của cuộc gọi đệ quy là 1.0/RAND_MAX, tức là khá nhỏ,
  2. nó phải được đệ quy hoặc theo cách khác gọi rand() nhiều lần, nếu bạn muốn sử dụng probability khác với bội số của 1.0/RAND_MAX.

Cũng lưu ý rằng xác suất vẫn còn hơi thiên vị. Xem câu hỏi this.

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