CS 121 Today Fractals and Turtles! The Koch Curve how random…

Preview:

Citation preview

CS 121 Today

Fractals and Turtles!

The Koch Curve

how random…

When good programs go bad…

def power(b, p): """ Returns b**p for p >= 0 """ if p == 0: return 1 else: return b*power(b, p)

print: Making programs talk to you!

Debugging had to be discovered. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in

finding mistakes in my own programs.- Maurice Wilkes

Programming: the art of debugging an empty file.

- The Jargon File

When good programs go bad…

def power(b, p): """ Returns b**p for p >= 0 """ print ("p is", p, "; b is", b) if p == 0: return 1 else: return b*power(b, p)

Careful! print != return

def power(b, p): """ Returns b**p for p >= 0 """ if p == 0: return 1 else: return b*power(b, p-1)

def powerPrint(b, p): """ Returns(?) b**p for p >= 0 """ if p == 0: print (1) else: print (b*powerPrint(b, p-1))

sum, range

def sum(L):

""" input: a list of numbers, L

output: L's sum

"""

sum, range

def sum(L):

""" input: a list of numbers, L

output: L's sum

"""

if len(L) == 0:

return 0.0

else:

return L[0] + sum(L[1:])

Base Caseif the input

has no elements, its sum is zero

Recursive Case

if L does have an element, add

that element's value to the sum of the REST of the

list…

This input to the recursive call must be "smaller" somehow…

sum, range

def range(low,hi):

""" input: two ints, low and hi

output: int list from low up to hi

"""

excluding hi

sum, range

def range(low,hi):

""" input: two ints, low and hi

output: int list from low up to hi

"""

if hi <= low:

return []

else:

return

excluding hi

sum, range

def range(low,hi):

""" input: two ints, low and hi

output: int list from low up to hi

"""

if hi <= low:

return []

else:

return [low] + range(low+1,hi)

excluding hi

A random aside…

import random

random.choice( L )

random.uniform(low,hi)

random.choice( ['north', 'case', 'west'] )

random.uniform(41.9,42.1)

chooses 1 element from the list L

(with uniform probability)

chooses a random float from low to hi

for more explanation, try dir(random) or help(random)

How likely is this to return 42 ?

How would you get a random int from 0 to 9?

Randomness vs. Determinism

Are there random numbers?

Output

RNG

Can a computer generate them?

A “black box” model of a random number generator.

Randomness vs. Determinism

Are there random numbers?

Can a computer generate them?

The RNG revealed.

Output

Yes Not without help!

http://en.wikipedia.org/wiki/Mersenne_twister

Periodic!

p = 219937-1

Some random history…

True randomness is valuable!

http://www.rand.org/pubs/monograph_reports/MR1418/index.html

but not that valuable!

A random function…

print the guesses ?

return the number of guesses ?

from random import *

def guess( hidden ): """ guesses the user's hidden # """ compguess = choice( range(100) )

if compguess == hidden: # at last! print ('I got it!’)

else: guess( hidden )

This is a bit suspicious…

slow down…

The final version

from random import *import time

def guessFinal( hidden ): """ guesses the user's hidden # """ compguess = choice( range(100) )

print ('I choose', compguess) time.sleep(0.05)

if compguess == hidden: # at last! print ('I got it!’)

return 0 else: return 1 + guessFinal( hidden )

The two Monte Carlos

Monte Carlo casino, Monaco

Making random numbers work

for you!

Monte Carlo methods, Math/CS

Monte Carlo in action

Suppose you roll two dice.What are the chances that you roll doubles?

def countDoubles( N ): """ inputs a # of dice rolls outputs the # of doubles """ if N == 0: return 0 # zero rolls, zero doubles… else: d1 = choice( [1,2,3,4,5,6] ) d2 = choice( range(1,7) ) if d1 != d2: return countDoubles( N-1 ) # not doubles else: return # doubles!

one roll of the dice

where is the doubles check?

input is the total number of rolls

what should the last line be?

Monty Hall

Let’s make a deal ’63-’86

inspiring the “Monty Hall paradox”

Monte Carlo Monty Hall

Suppose you always switch to the other door...What are the chances that you will win the car ?

Run it (randomly) 1000 times and see!

Monte Carlo Monty Hall

def MCMH( init, sors, N ): """ plays the same "Let's make a deal" game, N times returns the number of times you win the car """ if N == 0: return 0 # don't play, can't win carDoor = choice([1,2,3]) # where is the car?

if init == carDoor and sors == 'stay': result = 'Car!' elif init == carDoor and sors == 'switch': result = 'Spam.' elif init != carDoor and sors == 'switch': result = 'Car!' else: result = 'Spam.'

print ('You get the', result) if result == 'Car!': return 1 + MCMH( init, sors, N-1 ) else: return 0 + MCMH( init, sors, N-1 )

Your initial choice! 'switch' or 'stay'number of times to play

Python's Etch-a-Sketch

A new human-computer interface?

from turtle import *

reset()

left(90)

forward(50)

right(90)

backward(50)

down() or up()

color('green')

tracer(1) or tracer(0)

width(5)

done()

and lots more!

degrees!

states if the pen draws or not

states if the pen animates

or not

Recursive Graphics

def tri(): """ draws a polygon """ forward(100) left(120) forward(100) left(120) forward(100) left(120)

there is no tri … Could we tri this with recursion?(1)

Could we create any regular n-gon?(2)

def chai(size): """ mystery! """ forward(size) left(90) forward(size/2.0) right(90) right(90) forward(size) left(90) left(90) forward(size/2.0) right(90) backward(size)

What does chai draw?(1)

How could you add more to each end?

Why are there two identical commands in a row?

Spiral

100

90

81

72.9

spiral( initLength, angle, multiplier )

close-up of innermost part of the spiral…

spiral( 100, 90, 0.9 )

svTree

svTree( trunkLength, levels )

svTree( 100, 4 )

and more! (if you want)

Help! My turtle window froze!

Your turtle window becomes unresponsive after your programruns. Type:

>>> done()

to unlock it (but then you have to close it)

The Koch curve

snowflake( 100, 0 )snowflake( 100, 1 ) snowflake( 100, 2 )

snowflake( 100, 3 ) snowflake( 100, 4 ) snowflake( 100, 5 )

Have fun!

fill(1) color("blue")

Recommended