Probability Problem

Elliot Temple curi at curi.us
Tue Apr 25 03:09:08 EDT 2006


I think I got it. I noticed my code is essentially the same as Tim  
Peter's (plus the part of the problem he skipped). I read his code 20  
minutes before recreating mine from Alex's hints. Thanks!

def main():
     ways = ways_to_roll()
     total_ways = float(101**10)
     running_total = 0
     for i in range(1000-390+1):
         j = i + 390
         running_total += ways[i] * ways[j]
     print running_total / total_ways**2
     print ways[:10]

def ways_to_roll():
     result = [1]
     for i in xrange(10):
         result = combine([1] * 101, result)
     return result

def combine(a, b):
     results = [0] * (len(a) + len(b) - 1)
     for i, ele in enumerate(a):
         for j, ele2 in enumerate(b):
             results[i+j] += ele * ele2
     return results

main()
# output: 3.21962542309e-05 and
# [1, 10, 55, 220, 715, 2002, 5005, 11440, 24310, 48620]
# 3.21962542309e-05 is 32 out of a million



On Apr 24, 2006, at 9:14 PM, Alex Martelli wrote:

> Elliot Temple <curi at curi.us> wrote:
>
>> On Apr 24, 2006, at 8:24 PM, Alex Martelli wrote:
>>
>>> Lawrence D'Oliveiro <ldo at geek-central.gen.new_zealand> wrote:
>>>
>>>> In article <mailman.4949.1145931967.27775.python-list at python.org>,
>>>>  Elliot Temple <curi at curi.us> wrote:
>>>>
>>>>> Problem: Randomly generate 10 integers from 0-100 inclusive,  
>>>>> and sum
>>>>> them. Do that twice. What is the probability the two sums are 390
>>>>> apart?
>>>>
>>>> I think the sum would come close to a normal distribution.
>>>
>>> Yes, very close indeed, by the law of large numbers.
>>>
>>> However, very close (in a math course at least) doesn't get the  
>>> cigar.
>>>
>>> You can compute the requested answer exactly with no random number
>>> generation whatsoever: compute the probability of each result from
>>> 0 to
>>> 1000, then sum the probabilities of entries that are exactly 390
>>> apart.
>>
>> That was the plan, but how do I get the probability of any given
>> result? (in a reasonable amount of time)
>>
>> BTW I'm not in a math course, just curious.
>
> OK, I'll trust that last assertion (sorry for the hesitation, but it's
> all too easy to ``help'' somebody with a homework assignment and
> actually end up damaging them by doing it FOR them!-).
>
>
> I'm still going to present this in a way that stimulates thought,  
> rather
> than a solved problem -- humor me...!-)
>
>
> You're generating a uniformly distributed random number in 0..100 (101
> possibilities), 10 times, and summing the 10 results.
>
> How do you get a result of 0?  Only 1 way: 0 at each attempt --
> probability 1 (out of 1010 possibilities).
>
> How do you get a result of 1?  10 ways: 1 at one attempt and 0 at each
> of the others - probability 10 (again in 1010'ths;-).
>
> How do you get a result of 2?  10 ways for '2 at one attempt and 0 at
> each of the others', plus, 10*9/2 ways for '1 at two attempts and 0 at
> each of the others' -- probability 55 (ditto).
>
> ...and so forth, but you'd rather not work it out...
>
>
> So, suppose you start with a matrix of 101 x 10 entries, each of  
> value 1
> since all results are equiprobable (or, 1/1010.0 if you prefer;-).
>
> You want to compute the number in which you can combine two rows.  How
> could you combine the first two rows (each of 101 1's) to make a  
> row of
> 201 numbers corresponding to the probabilities of the sum of two  
> throws?
>
> Suppose you combine the first entry of the first row with each  
> entry of
> the second, then the second entry of the first row with each entry of
> the second, etc; each time, you get a sum (of two rolls) which  
> gives you
> an index of a entry (in an accumulator row starting at all zeros) to
> increment by the product of the entries you're considering...
>
>
> Can you generalize that?  Or, do you need more hints?  Just ask!
>
>
> Alex
> -- 
> http://mail.python.org/mailman/listinfo/python-list
>

-- Elliot Temple
http://www.curi.us/blog/






More information about the Python-list mailing list