import random def cointoss(n): for i in range(n): yield random.choice(['head', 'tail']) def expectedvalue(n): #Returns our win or loss after tossing coin for n times #head: we win 1 dollar, tail: we loose one dollar returnvalue = {'head': 1, 'tail': -1} return sum([returnvalue[coinflip] for coinflip in cointoss(n)]) print expectedvalue(100) print expectedvalue(100) print expectedvalue(100) print expectedvalue(100)

-2 14 16 4

Now let's take a look how we can do this in Python. We see that cointoss is the random part so we parameterize it as a function parameter.

import random def cointoss(n): for i in range(n): yield random.choice(['head', 'tail']) def expectedvalue(n, tossing_func=cointoss): #Returns our win or loss after tossing coin for n times #head: we win 1 dollar, tail: we loose one dollar #default tossing_func = cointoss returnvalue = {'head': 1, 'tail': -1} return sum([returnvalue[coinflip] for coinflip in tossing_func(n)]) def always_loose(n): for i in range(n): yield 'tail' def always_win(n): for i in range(n): yield 'head' assert expectedvalue(100, always_loose) == -100 assert expectedvalue(100, always_win) == 100 print expectedvalue(100)

-22

1. It doesn't work on codepad.org. Does it require some specific Python version?

ReplyDelete2. Even if it worked, couldn't you write like this and remove condition from inside the function?

def expectedvalue(n, tossing_func=cointoss):

Hi Ivan,

ReplyDeleteyou're right about your remark. I tested the same code in codepad where it fails. I modified the sample code and it should work in codepad as well now.

Thx for the remark !!