[#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 =

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