puzzle - Given a function for a fair coin, write a function for a biased coin? -
i came across reported interview question when doing reviewing (the following quote info found problem):
given function fair coin, write function biased coin returns heads 1/n times (n param)
at first glance wrote:
int biased_coin(n) { //0=tails, 1=heads int sum = 0; if(n==1) return 1; for(int i=0;i<n;i++) { sum += unbiased(); //unbiased returns 0 50% of time , 1 50% of time } if(sum == 1) return 1; return 0; }
but doesn't work. n=4, instance, work: since probability of getting single head given 4 tosses 4/(2^4)=1/4. n=3, 3/(2^3)!=1/3.
what proper way implement assuming can't use random number generator?
assuming:
int faircointoss();
returns 1 heads , 2 tails, writing:
int biasedcointoss(int n);
where heads (1) appear 1/n of time should work:
int biasedcointoss(int n) { if (n == 1) { return 1; // 1/1 = 1 = heads } else if (n == 2) { return faircointoss(); // 1/2 = 50% = fair coint oss } int r = random_number(n); return r == 0 ? 1 : 0; }
where random_number(n)
generates fair random integer such 0 <= < n
. random_number(3)
0, 1 or 2. assuming distribution, value 0 come out 1/3 of time.
of course can't use native random number generator can create 1 anyway. faircointoss()
randomly generates 1 or 0. multiple coin tosses can combined generate larger number. example:
faircointoss() << 1 | faircointoss()
will generate:
00 = 0 01 = 1 10 = 2 11 = 3
which definition random number 0 3 (n = 4).
that's fine if n power-of-2 isn't necessarily. that's easy enough cater however. assume n = 5. @ best can generate random number 0 7. if "reroll" 5, 6 or 7 until number in range of 0 4 have (non-deterministically) constructed random number distributed 0 4 inclusive, satisfying requirement.
code looks this:
int random_number(int n) { int ret; { int limit = 2; ret = faircointoss(); while (limit < n) { ret <<= 1; ret |= faircointoss(); limit <<= 1; } } while (ret >= n); return ret; }
Comments
Post a Comment