This is one way to accomplish the job with one call to rand and no
looping. It does limit the value of "n" to be less than 65536. If you
want to allow larger values of n, you can use two calls to rand, one
for a and the other for b.
Don

int custRand(int n)
{
        int a = rand(n*n+n)-1;
        int b = a / n;
        a %= n;
        return (b > a) ? n+a-b+1 : n-a+b;
}

On Aug 29, 10:48 am, Piyush Grover <[email protected]> wrote:
> Given a function rand(n) which returns a random value between 1...n assuming
> equal probability.
> Write a function CustRand(n) using rand(n) which returns a value between
> 1...n such that
> the probability of occurrence of each number is proportional to its value.
>
> I have a solution but wondering if I can get better than this or some other
> approaches:
>
> CustRand(n){
>
>     sum  = n*(n+1)/2;
>
>     a = rand(sum);
>     for(i = 1; i <= n; i++){
>          h = i*(i+1)/2;
>          l = i*(i-1)/2;
>          if(a <= h && a > l)
>              return i;
>     }
>
> }

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

Reply via email to