# [Edu-sig] Simple Stats (curriculum fragment...)

kirby urner kirby.urner at gmail.com
Wed May 27 06:15:37 CEST 2009

```"""
Simple randomizer and tally machine.
Drop a ball 'howmany' times so it falls
left or right for 'howmany' rows of
pegs -- like Pachinko

http://www.4dsolutions.net/ocn/graphics/randtrianim.gif

(c) GPL, 4D OCN 2009

Python 3.0.1 (r301:69556, Mar 14 2009, 14:06:26)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2
"""

from random import randint

def leftright():
"""
spit out L or R (left or right)
until the cows come home
"""
while True:
yield ['R','L'][randint(0,1)]

def the_fall(howfar):
"""
drop from the top: go left or right
for however far
"""
mypath = []
for i in range(howfar):
mypath.append(next(y)) # using da generator
return mypath

def many_falls(howmany, howfar):
"""
dropping the ball, building a dictionary (sample)
Order of Ls and Rs in a single fall leads to same
final position, so index by string e.g. LLLLRRR
"""
counters = {}
for i in range(howmany):
thepath = "".join((sorted(the_fall(howfar))))
counters[thepath] = counters.setdefault(thepath,0) + 1
return counters

def display(sample):
"""
spit out the fall strings in alpha order
with associated counts
"""
thekeys = sorted(sample.keys())
for i in thekeys:
print("%s : %4d" % (i, sample[i]))

def test():
"""
run a sample, display the results
"""
global y  # so we can use it anywhere!
y = leftright()
sample = many_falls(10000, 10)
display(sample)

if __name__ == '__main__':
test()

==========
Multiple runs:

>>>
LLLLLLLLLL :   15
LLLLLLLLLR :  109
LLLLLLLLRR :  438
LLLLLLLRRR : 1205
LLLLLLRRRR : 1976
LLLLLRRRRR : 2491
LLLLRRRRRR : 2118
LLLRRRRRRR : 1138
LLRRRRRRRR :  416
LRRRRRRRRR :   84
RRRRRRRRRR :   10

>>>
LLLLLLLLLL :   11
LLLLLLLLLR :   96
LLLLLLLLRR :  454
LLLLLLLRRR : 1144
LLLLLLRRRR : 2027
LLLLLRRRRR : 2444
LLLLRRRRRR : 2066
LLLRRRRRRR : 1194
LLRRRRRRRR :  443
LRRRRRRRRR :  111
RRRRRRRRRR :   10
>>>
```