Something như thế này:
int count = 0;
int index = -1;
for (int i = 0; i != n; ++i)
{
if (values[i])
{
++count;
if (unit_random <= 1.0f/count)
{
index = i;
}
}
}
Vì vậy, trong 4 giá trị ví dụ như bạn nhận được các xác suất sau cho chỉ số của họ:
1: (1/1) * (1/2) * (2/3) * (3/4) = 1/4
2: (1/2) * (2/3) * (3/4) = 1/4
3: (1/3) * (3/4) = 1/4
4: 1/4 = 1/4
EDIT: Như Steve Jessop chỉ ra những điểm so sánh nổi cuối cùng sẽ dẫn đến một lựa chọn rất không đồng đều. Giả sử unit_random
được định nghĩa là rand()/RAND_MAX
sự so sánh có thể được thay đổi để:
typedef unsigned long long u64;
u64 product = u64(count) * rand();
if (product <= u64(RAND_MAX))
này sẽ không cung cấp phân phối hoàn hảo do tính chất rời rạc của rand
nhưng nó sẽ được tốt hơn.
Nguồn
2012-03-23 13:42:24
Xin lỗi, tôi quên nói lời nào. Tôi muốn nói: trả về chỉ số của giá trị TRUE ngẫu nhiên ... Không chỉ là giá trị đầu tiên mà chúng ta tìm thấy. Nhưng hàm sẽ trả về ngẫu nhiên bất kỳ một chỉ mục nào có chứa TRUE. – PaulV
@PaulV Đó chính là chức năng của chức năng này. –
@Nick Yeah, nhưng tôi đã chỉnh sửa câu trả lời của mình;) –