[#35036] Intentional Programming — "John" <nojgoalbyspam@...>

Hi all

17 messages 2002/03/01

[#35112] RDoc question — Michael Davis <mdavis@...>

I have a question about RDoc. I would like to reference an external

17 messages 2002/03/02

[#35162] string to array and back — Ron Jeffries <ronjeffries@...>

I am needing to convert strings to arrays of bytes and back. I see pack and

19 messages 2002/03/03

[#35364] file reading impossibly slow? — Ron Jeffries <ronjeffries@...>

So I'm doing this benchmark to work with my set program. Part of the problem is

18 messages 2002/03/07

[#35429] Interesting link on static/dynamic typing... — Robert Feldt <feldt@...>

...relevant to Ruby compared to other languages discussion:

25 messages 2002/03/08
[#35441] Re: Interesting link on static/dynamic typing... — Paul Brannan <paul@...> 2002/03/08

On Fri, Mar 08, 2002 at 05:34:43PM +0900, Robert Feldt wrote:

[#35460] Spam, ruby-talk, and me — Dave Thomas <Dave@...>

14 messages 2002/03/08

[#35537] Confusion — David Corbin <dcorbin@...>

The following is from my debugging through xmlc.rb

16 messages 2002/03/10

[#35579] RE: WIN32OLE and LDAP — "Morris, Chris" <chris.morris@...>

> The new version 0.4.2 of Win32OLE has WIN32OLE.bind method.

16 messages 2002/03/11

[#35652] Method type 'abstract' — Peter Hickman <peter@...>

The one thing I miss in Ruby is the abstract class method to go along

15 messages 2002/03/12

[#35653] Some potential RCRs — "Bob Alexander" <bobalex@...>

Here are a few thing I am considering submitting as RCRs. I'm looking for comments to help decide whether to make them official, so please let know what you think is good and bad about these...

50 messages 2002/03/12
[#35672] Re: Some potential RCRs — matz@... (Yukihiro Matsumoto) 2002/03/12

Hi,

[#35683] Re: Some potential RCRs — Massimiliano Mirra <list@...> 2002/03/12

On Wed, Mar 13, 2002 at 03:58:01AM +0900, Yukihiro Matsumoto wrote:

[#35697] Re: Some potential RCRs — David Alan Black <dblack@...> 2002/03/13

Hello --

[#35694] rpkg 0.3 — Massimiliano Mirra <list@...>

14 messages 2002/03/13
[#35699] RE: [ANN] rpkg 0.3 — <james@...> 2002/03/13

>

[#35787] testunit - setup -> set_up ? — "Morris, Chris" <chris.morris@...>

I'm just starting to use testunit instead of rubyunit ... I noticed with an

21 messages 2002/03/13
[#35793] RE: testunit - setup -> set_up ? — "Nathaniel Talbott" <nathaniel@...> 2002/03/13

Morris, Chris [mailto:chris.morris@snelling.com] wrote:

[#35796] Re: testunit - setup -> set_up ? — Dave Thomas <Dave@...> 2002/03/13

"Nathaniel Talbott" <nathaniel@talbott.ws> writes:

[#35797] RE: testunit - setup -> set_up ? — "Nathaniel Talbott" <nathaniel@...> 2002/03/13

dave@thomases.com [mailto:dave@thomases.com] wrote:

[#35898] camelCase and underscore_style — "Morris, Chris" <chris.morris@...>

First, a question. If underscore_style is the Ruby norm for methods and the

20 messages 2002/03/15
[#35924] Re: camelCase and underscore_style — "Guy N. Hurst" <gnhurst@...> 2002/03/15

Phil Tomson wrote:

[#35930] RE: camelCase and underscore_style — "Nathaniel Talbott" <nathaniel@...> 2002/03/16

Guy N. Hurst [mailto:gnhurst@hurstlinks.com] wrote:

[#35989] ANN: Locana GUI and GUI Builder version 0.81 — Michael Davis <mdavis@...>

I am pleased to announce release 0.81 of Locana. Locana is a GUI

16 messages 2002/03/16

[#35992] XPath — Michael Schuerig <schuerig@...>

27 messages 2002/03/16

[#36034] Mini Rant: Indenting — Thomas Hurst <tom.hurst@...>

Why is it that I see *so* much code like:

14 messages 2002/03/17

[#36049] web templating for static sites? — Massimiliano Mirra <list@...>

I'm using the Template Toolkit for generating static web sites and I

42 messages 2002/03/17
[#36426] web standars (was: web templating for static sites?) — Tobias Reif <tobiasreif@...> 2002/03/20

Albert Wagner wrote:

[#36052] Xml Serialization for Ruby — "Chris Morris" <chrismo@...>

=Xml Serialization for Ruby

20 messages 2002/03/17
[#36059] Re: [ANN] Xml Serialization for Ruby — Massimiliano Mirra <list@...> 2002/03/17

On Mon, Mar 18, 2002 at 05:20:56AM +0900, Chris Morris wrote:

[#36067] eval/Module question — David Corbin <dcorbin@...>

If I have a String src that is similar to the following:

13 messages 2002/03/18

[#36157] Development of Windows version of Ruby — ptkwt@...1.aracnet.com (Phil Tomson)

Now that we've dumped the cygwin requirement for the Windows version of

63 messages 2002/03/18
[#36330] Re: Development of Windows version of Ruby — Ron Jeffries <ronjeffries@...> 2002/03/19

On Tue, 19 Mar 2002 14:05:27 GMT, "Albert L. Wagner" <alwagner@uark.edu> wrote:

[#36431] Re: Development of Windows version of Ruby — Dennis Newbold <dennisn@...> 2002/03/20

[#36458] Windows version of Ruby (proposals) — ptkwt@... (Phil Tomson) 2002/03/21

Dennis Newbold <dennisn@pe.net> wrote in message news:<Pine.GSO.3.96.1020320113603.22242B-100000@shell2>...

[#36482] RE: Windows version of Ruby (proposals) — "Christian Boos" <cboos@...> 2002/03/21

Some thoughts on the 2 first Windows issues, plus a 4th one...

[#36496] Re: Windows version of Ruby (proposals) — Dave Thomas <Dave@...> 2002/03/21

"Christian Boos" <cboos@bct-technology.com> writes:

[#36510] Re: Windows version of Ruby (proposals) — nobu.nokada@... 2002/03/21

Hi,

[#36514] Re: Windows version of Ruby (proposals) — Dave Thomas <Dave@...> 2002/03/21

nobu.nokada@softhome.net writes:

[#36518] Re: Windows version of Ruby (proposals) — nobu.nokada@... 2002/03/21

Hi,

[#36211] dots in Dir.entries — matz@... (Yukihiro Matsumoto)

Hi,

22 messages 2002/03/19

[#36231] style choice — Ron Jeffries <ronjeffries@...>

A style question for the community ... which of the following do you prefer, and

18 messages 2002/03/19

[#36345] ANN: REXML 2.0 — Sean Russell <ser@...>

I have a feeling there will only be three major revisions of REXML. Version

19 messages 2002/03/20

[#36610] Re: Windows version of Ruby (proposals) — Ron Jeffries <ronjeffries@...>

On Thu, 21 Mar 2002 14:11:55 GMT, Dave Thomas <Dave@PragmaticProgrammer.com> wrote:

16 messages 2002/03/22

[#36645] Ruby for Mac OS 10.1 — Jim Freeze <jim@...>

Hi:

28 messages 2002/03/23

[#36768] Re: Difference between 'do' and 'begin' — Clemens Hintze <c.hintze@...>

In <slrna9ulvi.f2h.mwg@fluffy.isd.dp.ua> Wladimir Mutel <mwg@fluffy.isd.dp.ua> writes:

23 messages 2002/03/26
[#36783] RE: Difference between 'do' and 'begin' — <james@...> 2002/03/26

[#36792] Re: Difference between 'do' and 'begin' — Kent Dahl <kentda@...> 2002/03/26

james@rubyxml.com wrote:

[#36808] Error calling Tk in a loop — <james@...>

I'm trying to write some code that pops up a Tk window when for certain

15 messages 2002/03/26

[#36841] RE: Windows version of Ruby (proposals) — "Andres Hidalgo" <sol123@...>

I believe that Ruby has a place in windows (Office), I happened to have

14 messages 2002/03/27

[#36863] Hash.new(Hash.new) doesn't use Hash.new as default value — "Jonas Delfs" <jonas@...>

Hi -

18 messages 2002/03/27

[#37080] Why isn't Math object-oriented? — Bil Kleb <W.L.Kleb@...>

So I'm reading along in the Pixaxe book (yet again), and I am told

15 messages 2002/03/30

[#37121] String#begins?(s) — timsuth@... (Tim Sutherland)

class String

24 messages 2002/03/31

Re: ruby simulations

From: "Thomas A. Reilly" <w3gat@...>
Date: 2002-03-22 03:26:01 UTC
List: ruby-talk #36560
When I had learned of ruby I had thought that it would be useful to create 
a quick and dirty simulation.  Living in Louisiana we have small towns 
almost everyone who has the same last name and I have also wondered about 
the growth of communities such as the Mayflower community and the lost 
colony in Virginia.

It was a great way to learn ruby.

Tom Reilly

Attachments (1)

FAMNAM.RB (6.29 KB, text/x-ruby)
#----------------------------------------------------------------
#
#	famnam.rb - family name simulation
#
#----------------------------------------------------------------

$mar_rate = .11
$birth_rate = .21
$divorce_rate = .013
$pstart = 200		# of people at the start of simulation
$simyrs = 1000         # years of simulation


def lookup(arg,argt,argf)
	i = 0
	if argt.size == argf.size
		argt.each_index do |i|
			if argt[i] >= arg
				break
			end
		end
		if argt[i + 1] == argt[i]
			argf[i]
		else
			delta = (argf[i + 1] - argf[i])/(argt[i + 1] - argt[i])
			dd = (arg - argt[i]) / (argt[i + 1] - argt[i])
			argf[i] + (dd * delta)
		end
	else
		print "ARRAY SIZE ERROR ", argt.size, " ", argf.size, "\n"
		exit
	end
end

#----------------------------------------------------------------------
class Birth
	def initialize(father, mother)
		@sex = rand(2)
		if @sex == 1
			@dom = $yr + lookup(rand() * 100,$ixm,$ixa)
		else
			@dom = $yr + lookup(rand() * 100,$ixf,$ixa)
		end
		@dob = $yr
		@pid = getgene
		@name = ""
		@married = false
		@gene = Array.new
		if father == nil
			@gene[0] = getgene
			@gene[1] = getgene
			@gene[2] = getgene
			mkname
		else
			@name = father.name
			@gene[0] = father.pid
			@gene[1] = father.gene[0]
			@gene[2] = father.gene[1]
		end
		if mother == nil
			@gene[3] = getgene
			@gene[4] = getgene 
			@gene[5] = getgene 
		else
			@gene[3] = mother.pid
			@gene[4] = mother.gene[0]
			@gene[5] = mother.gene[1]
			mkname if father == nil
		end
	end	

	def view
		print "name ", @name, " pid ", @pid, " dob ", @dob, " mort ", @dom, " sex ", @sex, "\n"
		print "   parents "
		print gene.each {|i| print i, " "}		
		print "---\n"
	end

	def name
		@name
	end

	def pid
		@pid
	end

	def gene
		@gene
	end

	def dom
		@dom
	end

	def rip
		$yr > @dom
	end

	def married
		@married
	end

	def marry
		@married = true
	end

	def unmarry
		@married = false
	end

	def age
		$yr - @dob
	end

	def sex
		@sex
	end

	def dob
		@dob
	end

private
	def mkname
		@name = ""
		(1..5).each do |i|
			ch = rand(25)
			ch += "A".slice(0)
			@name = @name + ch.chr
		end
	end

	def getgene
		$pix += 1
	end
			
end

#--------------------------------------------------------------------------
public
class Population
	def initialize
		@plist = Array.new
		@marriages = Array.new
		@male_eligible = Array.new 
		@female_eligible = Array.new
		@birth_count = 0
		@marriage_count = 0
		@died = 0
		@name_count = 0
		$pstart.times do
			@plist.push(Birth.new(nil,nil))
		end
	end

	def birth(dad,mom)
		@plist.push(Birth.new(dad,mom))
	end

	def size
		@plist.size
	end

	def kill
		@died = 0
#|		@plist.each_index do |person|
#|			print @plist[person].dom, " ", @plist[person].dom.type, "\n"
#|		end
		@plist.each {|per| @died += 1 if per.rip}
		@plist.delete_if {|per| per.rip}
		@plist.compact
		@died
	end 

	def each
		for i in @plist
			yield(i)
		end
	end

		# - Count the number of names in the population
	def names
		names = Hash.new(0)
		@plist.each {|p| names[p.name] += 1}
		@name_count = names.size
	end


	def stats
		print "YEAR ", $yr, ", POPULATION ", @plist.size, ", MARRIAGES ", @marriage_count, ", BIRTHS ", @birth_count, ", DEATHS ", @died, ", NAMES ", @name_count, "\n" 
		exit if @plist.size == 0
	end		

	def marriage_end
		@marriages.each_index do |m|
			msw = false
			if $yr > @marriages[m].him.dom || $yr > @marriages[m].her.dom
				@marriages[m].unmarry
				@marriages[m].smend
			else
				if rand() < $divorce_rate
					@marriages[m].unmarry
					@marriages[m].smend
				end
			end
		end
		@marriages.delete_if {|mp| mp.mend == true}
		@marriages.compact
	end

	def year
		marry
		make_babies
		names
		marriage_end
		kill
		stats
		wstat
	end

	def make_babies
		@birth_count = 0
		@marriages.each do |m|
			if $yr - m.her.dob > 15 && $yr - m.her.dob < 45
				if rand() < $birth_rate
					@birth_count += 1
					@plist.push(Birth.new(m.him,m.her))
				end
			end
		end		 
		
	end 

	def marry
		@male_eligible.clear
		@female_eligible.clear
		@marriage_count = 0
		@plist.each do |p|
			if p.sex == 1 && p.age > 16 && p.married == false then @male_eligible.push(p)
			end
			if p.sex == 0 && p.age > 16 && p.married == false then @female_eligible.push(p)
			end
		end
		melig = @male_eligible.size
		felig = @female_eligible.size
		if melig < felig
			marmin = melig
		else
			marmin = felig
				marmin = felig
		end
		(1..marmin).each do |i|
			marsw = false
			malep = rand(melig)
			femp = rand(felig)
			man_elig = @male_eligible[malep]
			lady_elig = @female_eligible[femp]
			# insest prevention
			lady_elig.gene.each do |fi|
				man_elig.gene.each do |mi|
					if fi == mi
						marsw = true
					end
				end
			end
			marsw = true if rand() > $mar_rate
			if marsw == false
				@marriages.push(Marriage.new(@male_eligible[ malep ], @female_eligible[ femp]))
				@marriage_count += 1
#				@male_eligible[malep].delete
#				@female_eligible[femp].delete
				melig -= 1
				felig -= 1
			end
		end
	end
	
	def pop_dist
		pop_a = Array.new(15,0)
		pop_tot = 0
		@plist.each {|p| pop_a[(p.age / 10).to_i] += 1}
		pop_a.each {|i| pop_tot += i}
		pop_a.each_index do |i|
			pf = 1000.0 * pop_a[i].to_f / pop_tot.to_f
			printf("%d  %0.2d\n",i,pf)
		end
	end

	def wstat
		$stfile.write("#{$yr}\t#{size}\t#{@marriages.size}\t#{@male_eligible.size}\t#{@female_eligible.size}\t#{@birth_count}\t#{@marriage_count}\t#{@died}\t#{@name_count}\n")
	end

end			

#----------------------------------------------------------------------
class Marriage
	def initialize(him,her)
		@mend_flag = false
		@him = him
		@her = her
		@him.marry
		@her.marry
	end

	def unmarry
		@him.unmarry
		@her.unmarry
	end

	def her
		@her
	end

	def him
		@him
	end

	def mend
		@mend
	end

	def smend
		@mend = true
	end

end

#----------------------------------------------------------------------
$yr = 1
$pix = 0
$ixa = [1,2,3,4,5,10,20,30,40,50,60,70,80,90,100,110,120,120]
$ixm = [0,1.33,2,2,2.67,3.33,4,4.67,5.33,14,24,47.33,77.33,96,99.33,100,100,100]
$ixf = [0,1.33,2,2,2,2,2.67,2.67,4,8,5.33,22,50,88.67,98,99.33,100,100]
$stfile = File.open("stfile","w")
$stfile.write("year\tsize\tmarriages\tmale_eligible\tfemale_eligible\tbirth_count\tmarriage_count\tdied\tname_count\n")

population = Population.new


 (1..$simyrs).each do 
	population.year
	$yr += 1
end
population.pop_dist
names = Hash.new(0)
population.each {|p| names[p.name] += 1}
names.each {|n,c| $stfile.write "#{n}\t#{c}\n"}
$stfile.close


In This Thread