[Haskell-cafe] St. Petersburg Game

Lutz Donnerhacke lutz at iks-jena.de
Tue Nov 27 08:51:26 EST 2007


* manolo at austrohungaro.com wrote:
> I'm trying to program an implementation of the St. Petersburg game in
> Haskell. There is a coin toss implied, and the random-number generation is
> driving me quite mad. So far, I've tried this:
>
> import Random

import System.Random  -- time goes on, interfaces change

> increment :: Int -> Int
> increment b = b + 1
>
>
> main =  do	let b = 0
> 		let c = randomRIO (1,2)
> 		until (c == 1)	increment b
>               	return b

In Haskell you take it the other side around:
  - Given a random number generator
    System.Random.newStdGen :: IO StdGen
    
  - you generate an infinite list of coin flip results
    System.Random.randoms  :: (RandomGen g) =>          g -> [a]
    System.Random.randomRs :: (RandomGen g) => (a,a) -> g -> [a]
  
  - you are interested in the the first elements of a given value
    takeWhile :: (a -> Bool) -> [a] -> [a]
  
  - and need to compute the length of this list
    length :: [a] -> Int
  

To model the result of a coin flip, you need two possible values.
Your choice [1,2] is possible, but the boolean values are much easier.
Let's choose True for number up and False otherwise.

Put it together:

main :: IO ()
main = do
  rnd <- newStdGen
  let result = computeResult rnd
  print result

computeResult :: (RandomGen g) => g -> Int
computeResult = length . takeWhile not . randoms

Or in short:

main = print . length . takeWhile not . randoms =<< newStdGen


More information about the Haskell-Cafe mailing list