number generator

Duncan Smith buzzard at urubu.freeserve.co.uk
Tue Mar 13 21:25:42 EDT 2007


Hendrik van Rooyen wrote:
>  "Nick Craig-Wood" <nick at craig-wood.com> wrote:
> 
> 
>>Paul Rubin <http> wrote:
>>
>>> The fencepost method still seems to be simplest:
>>>
>>>     t = sorted(random.sample(xrange(1,50), 4))
>>>     print [(j-i) for i,j in zip([0]+t, t+[50])]
>>
>>Mmm, nice.
>>
>>Here is another effort which is easier to reason about the
>>distribution produced but not as efficient.
>>
>>def real(N, M):
>>    while 1:
>>        t = [ random.random() for i in range(N) ]
>>        factor = M / sum(t)
>>        t = [ int(round(x * factor)) for x in t]
>>        if sum(t) == M:
>>            break
>>        print "again"
>>    assert len(t) == N
>>    assert sum(t) == M
>>    return t
>>
>>It goes round the while loop on average 0.5 times.
>>
>>If 0 isn't required then just test for it and go around the loop again
>>if found.  That of course skews the distribution in difficult to
>>calculate ways!
>>
> 
> 
> I have been wondering about the following as this thread unrolled:
> 
> Is it possible to devise a test that can distinguish between sets
> of:
> 
> - five random numbers that add to 50, and
> - four random numbers and a fudge number that add to 50?
> 
> My stats are way too small and rusty to attempt to answer 
> the question, but it seems intuitively a very difficult thing.
> 
> - Hendrik
> 

Yes, if the generating processes yield numbers from different
probability mass functions.  You could simply look at the likelihood
ratio.  Otherwise, the likelihood ratio will be 1.

Duncan



More information about the Python-list mailing list