Here is the source code of wc2010.rb.

#! /usr/bin/ruby

#

# World Cup 2010 point simulator

# Copyright (C) 2010 Yamauchi Hitoshi

# License: new BSD.

#------------------------------------------------------------

require "getoptlong.rb"

WC2010 = "0.0.0"

MAX_MATCHES = 64

#------------------------------------------------------------

# class Wc2010

#------------------------------------------------------------

class Wc2010

# constructor

def initialize()

# last year's result as probability distribution function

@sample = [

4, 2, 0, 2, 1, 0, 0, 0, 2, 1,

0, 1, 3, 1, 0, 1, 3, 1, 0, 3,

2, 0, 2, 1, 0, 0, 1, 0, 4, 0,

2, 2, 1, 0, 3, 0, 2, 0, 1, 0,

6, 0, 2, 1, 0, 0, 2, 0, 0, 2,

1, 1, 0, 0, 2, 0, 1, 1, 0, 2,

0, 4, 3, 1, 0, 3, 1, 2, 2, 0,

2, 2, 2, 1, 1, 1, 0, 0, 3, 2,

0, 2, 2, 1, 1, 4, 2, 2, 0, 1,

1, 0, 0, 2, 2, 0, 2, 0, 2, 1,

1, 0, 1, 0, 1, 0, 0, 0, 3, 0,

1, 3, 1, 1, 3, 0, 0, 0, 0, 1,

0, 2, 0, 1, 3, 1, 1, 1]

@max_point = @sample.max {

|a,b|

a <=> b

}

# sample bin. Array [0, 0, ..., 0], size == @max_point + 1

@sample_bin = Array.new(@max_point + 1, 0)

@accum_dist = Array.new(@max_point + 1, 0)

# put them to the bin

for val in @sample

@sample_bin[val] = @sample_bin[val] + 1

end

@accum_max = 0

idx = 0

for hist in @sample_bin

@accum_max = @accum_max + hist

@accum_dist[idx] = @accum_max

idx = idx + 1

end

idx = 0

for val in @accum_dist

idx = idx + 1

end

@range_array = []

@range_array << Range.new(0, @accum_dist[0], true)

# create range objects

idx = 0

while idx < (@accum_dist.length - 1)

@range_array << Range.new(@accum_dist[idx], @accum_dist[idx + 1], true)

idx = idx + 1

end

idx = 0

for r in @range_array

idx = idx + 1

end

end

# get random value -> point with the same distribution of last year

# \param _rd uniform random value

# \return generated random variable

def get_point(_rd)

begin

idx = 0

for r in @range_array

if r.include? _rd then

return idx

end

idx = idx + 1

end

raise RuntimeError.new(_rd.to_s + " is not in any range.\n")

end

end

# run the simulation

def run()

begin

srand(42) # always the same for debug.

idx = 0

while idx < MAX_MATCHES do

rd1 = rand(@accum_max)

rd2 = rand(@accum_max)

pt1 = get_point(rd1)

pt2 = get_point(rd2)

print "[" + (idx + 1).to_s + "]: " + pt1.to_s + ' ' + pt2.to_s + "\n"

idx = idx + 1

end

end

end

end

#------------------------------

# command line option parsing

#------------------------------

args = GetoptLong.new();

args.set_options(['--version', '-V', GetoptLong::NO_ARGUMENT]);

begin

args.each_option do |name, arg|

# print(name + ", " + arg + ":\n")

eval "$OPT_#{name.sub(/^--/, '').gsub(/-/, '_').upcase} = '#{arg}'"

end

rescue

exit(1)

end

#--- show version

if $OPT_VERSION

$stderr.print(WC2010 + "\n")

exit(1)

end

wc = Wc2010.new()

wc.run()

# --- end of wc2010.rb