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,
- probabil ity của cuộc gọi đệ quy là
1.0/RAND_MAX
, tức là khá nhỏ,
- 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.
+1 Tuyệt vời, cảm ơn (trên cùng). –
Thứ hai có thể thực sự nhanh hơn. Chúng giống nhau về mặt toán học. – Colin
Đ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