/*
Calculating the probability for a random testing target selection
strategy to achieve the same or better accuracy than a given selection.
Requires:
(GNU) bc
Usage Example:
echo "prob(450,39,85,34)" | bc -l prob.l
*/
# To count the number of leading zeros:
# echo "prob(450,39,85,34)" | bc -l prob.l | sed -n "s/\.\(0\+\)\([1-9][0-9]*\)*.*/\1/p" | wc -c
scale=100
define comb(n,k) {
auto temp, i
temp=1;
if (k==0)
return (1);
for(i=1; i<=k; i++)
temp=temp*(n+1-i)/i;
return (temp);
}
define prob(total,risky,recommended,actual_risky) {
auto i, j, good, all, cases
good=total-risky;
cases=0;
all=2^total;
for(j=recommended; j>=actual_risky; j--) {
for(i=actual_risky; i<=risky && i<=j; i++) {
c1=comb(risky, i);
c2=comb(good, j-i);
cases=cases+c1*c2;
}
}
return (cases/all);
}
total = read()
risky = read()
recommend = read()
actual = read()
print "Probability=",prob(total,risky,recommend,actual),"\n"
LyoKICBDYWxjdWxhdGluZyB0aGUgcHJvYmFiaWxpdHkgZm9yIGEgcmFuZG9tIHRlc3RpbmcgdGFyZ2V0IHNlbGVjdGlvbgogIHN0cmF0ZWd5IHRvIGFjaGlldmUgdGhlIHNhbWUgb3IgYmV0dGVyIGFjY3VyYWN5IHRoYW4gYSBnaXZlbiBzZWxlY3Rpb24uCiAKICBSZXF1aXJlczoKICAgIChHTlUpIGJjCiAKICBVc2FnZSBFeGFtcGxlOgogICAgZWNobyAicHJvYig0NTAsMzksODUsMzQpIiB8IGJjIC1sIHByb2IubAoqLwoKIyAgVG8gY291bnQgdGhlIG51bWJlciBvZiBsZWFkaW5nIHplcm9zOgojICAgIGVjaG8gInByb2IoNDUwLDM5LDg1LDM0KSIgfCBiYyAtbCBwcm9iLmwgfCBzZWQgLW4gInMvXC5cKDBcK1wpXChbMS05XVswLTldKlwpKi4qL1wxL3AiIHwgd2MgLWMKCnNjYWxlPTEwMAoKZGVmaW5lIGNvbWIobixrKSB7CiAgYXV0byB0ZW1wLCBpCiAgdGVtcD0xOwogIGlmIChrPT0wKSAKICAgIHJldHVybiAoMSk7CiAgZm9yKGk9MTsgaTw9azsgaSsrKSAKICAgIHRlbXA9dGVtcCoobisxLWkpL2k7CiAgcmV0dXJuICh0ZW1wKTsKfQogCmRlZmluZSBwcm9iKHRvdGFsLHJpc2t5LHJlY29tbWVuZGVkLGFjdHVhbF9yaXNreSkgewogIGF1dG8gaSwgaiwgZ29vZCwgYWxsLCBjYXNlcwogIGdvb2Q9dG90YWwtcmlza3k7CiAgY2FzZXM9MDsKICBhbGw9Ml50b3RhbDsKICBmb3Ioaj1yZWNvbW1lbmRlZDsgaj49YWN0dWFsX3Jpc2t5OyBqLS0pIHsKICAgIGZvcihpPWFjdHVhbF9yaXNreTsgaTw9cmlza3kgJiYgaTw9ajsgaSsrKSB7CiAgICAgIGMxPWNvbWIocmlza3ksIGkpOwogICAgICBjMj1jb21iKGdvb2QsIGotaSk7CiAgICAgIGNhc2VzPWNhc2VzK2MxKmMyOwogICAgfQogIH0KICByZXR1cm4gKGNhc2VzL2FsbCk7Cn0KCnRvdGFsID0gcmVhZCgpCnJpc2t5ID0gcmVhZCgpCnJlY29tbWVuZCA9IHJlYWQoKQphY3R1YWwgPSByZWFkKCkKcHJpbnQgIlByb2JhYmlsaXR5PSIscHJvYih0b3RhbCxyaXNreSxyZWNvbW1lbmQsYWN0dWFsKSwiXG4iCgo=