Thanks for the explanation Don! It looks like I need better math-foo to 
completely understand your explanation...

On Tuesday, February 11, 2014 10:07:05 AM UTC-8, Don wrote:
>
>
> It can be shown mathematically that if you use a multiplier A such that 
> A*2^15-1 and A*2^16-1 are both prime, you get a sequence with period 
> A*2^15. With A=63663 you get a sequence of nearly two billion. If A was 
> larger than 2^16, the multiplication would result in overflow in some 
> cases, so the value I used was near the limit. The generator uses only the 
> low 16 bits as output. The high 16 bits, however, are kept as state, 
> meaning that you can't tell from the current output what the next output 
> will be. The full cycle contains each possible output value an equal number 
> of times, so over a large sample, the outputs are all equally likely.
>
> Using mod 1000 is not a perfect way to get a uniform value in the range 
> 0-1000. Because the outputs are in the range 0..65536, there are 65 ways to 
> generate numbers <= 536 and 66 ways to generate numbers > 536. A better way 
> to generate a number in the range 0..n-1 is to divide the output by 
> 65535/n. Then check the result and if it is >= n, repeat the process until 
> you get a valid result.
>
> Don
>
> On Tuesday, February 11, 2014 1:18:26 AM UTC-5, SVIX wrote:
>>
>> :) true... that was silly of me.. I was too quick to post... anyway, the 
>> point I was trying to understand was why this specific combination of 
>> operations would produce good randomness... Running the original solution 
>> you posted a million times (with the max limit set to 1000), below is the 
>> frequency of the numbers generated (in the format <number> X <frequency> )
>>
>>
>> On Friday, February 7, 2014 11:42:03 AM UTC-8, Don wrote:
>>>
>>> Because if you put that in a loop you will get a series like:
>>>
>>> 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5...
>>>
>>> On Thursday, February 6, 2014 8:27:27 PM UTC-5, SVIX wrote:
>>>>
>>>> Just curious... Why is this more random than 
>>>> (getSystemTimeInMilliseconds() % 10)
>>>>
>>>> On Thursday, February 6, 2014 1:47:15 PM UTC-8, Don wrote:
>>>>>
>>>>> Just noticed that you asked for 1-10, and my code will clearly 
>>>>> generate 0-9. Add one for the desired range.
>>>>> Don
>>>>>
>>>>> On Wednesday, February 5, 2014 4:29:26 PM UTC-5, Don wrote:
>>>>>>
>>>>>> // Using George Marsaglia's Multiply With Carry generator
>>>>>> int rnd10()
>>>>>> {
>>>>>>    static unsigned int x = time(0);
>>>>>>    x = 63663 * (x&65535) + (x>>16);
>>>>>>    return (x & 65535) % 10;
>>>>>> }
>>>>>>
>>>>>> On Sunday, February 2, 2014 2:51:47 AM UTC-5, atul007 wrote:
>>>>>>>
>>>>>>> Generate random number form 1 - 10 with probability of 1/10.You are 
>>>>>>> not allowed to used rand() function.
>>>>>>>
>>>>>>> any simple way of achieving above with using any complex 
>>>>>>> implementation of random number generators algorithm . 
>>>>>>>  
>>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].

Reply via email to