[metapost] Drawing a urn

Mojca Miklavec mojca.miklavec.lists at gmail.com
Thu Nov 29 20:37:06 CET 2007


On Nov 29, 2007 1:09 PM, Martin Kaffanke wrote:
> Hi there!
>
> I'd like to draw an urn where we have a probability of .57 to get a dark
> ball when we choose a random ball.
>
> I have the following:
>
>  u := 5mm;
>  s := .05u;
>
>  draw (0,10u+s)--(0,.5u)..(.15u,.15u)..(.5u,0)
>       --(9.5u+2s,0)..(9.85u+2s,.15u)..(10u+2s,.5u)--(10u+2s , 10u+s);
>
>  path c;
>  for i=1 upto 10:
>    for j=1 upto 10:
>      c := fullcircle scaled 1u shifted (j*u-u/2+s,i*u-u/2+s);
>      if (i <= 5 ):
>         fill c withcolor .7white;
>      else:
>         fill c withcolor .4white;
>      fi;
>    endfor;
>  endfor;
>
> This looks nice, but it shows a fifty-fifty chance.  How would you go
> further to show a chance of .57 instead of .5?
>
> Second: !important! I'd like to have the balls randomized.  In a java
> application I do the same by creating 100 boolean values (true = dark,
> false = white) something like
>
> for i=1 upto 100:
>   if i <= .57:
>     values.append(.4white);
>   else:
>     values.append(.7white);
>   fi;
> endfor;
>
> mix(values);

Approach nr. 1: define 57 blacks (and write your own mixing function)
Approach nr. 2: assign colors randomly and fix afterwards if needed
until you have the desired number of them

Mojca


beginfig(1);
u := 5mm;
s := .05u;

draw (0,10u+s)--(0,.5u)..(.15u,.15u)..(.5u,0)
  --(9.5u+2s,0)..(9.85u+2s,.15u)..(10u+2s,.5u)--(10u+2s , 10u+s);

boolean is_black[][];
numeric number_of_black; number_of_black := 0;
numeric probability_for_black; probability_for_black := 0.57;

path c;

for i=1 upto 10:
	for j=1 upto 10:
		if uniformdeviate(1) < probability_for_black:
			is_black[i][j] := true;
			number_of_black := number_of_black + 1;
		else:
			is_black[i][j] := false;
		fi;
	endfor;
endfor;

forever:
	exitif number_of_black=57;

	a := ceiling(uniformdeviate(9.9999)+0.0001); % prevent getting 0 (eps
should be used)
	b := ceiling(uniformdeviate(9.9999)+0.0001);
	
	if     (number_of_black<probability_for_black*100) and not is_black[a][b]:
		is_black[a][b] := true;
		number_of_black := number_of_black + 1;
	elseif (number_of_black>probability_for_black*100) and is_black[a][b]:
		is_black[a][b] := false;
		number_of_black := number_of_black - 1;
	fi;
endfor;

for i=1 upto 10:
	for j=1 upto 10:
		c := fullcircle scaled 1u shifted (j*u-u/2+s,i*u-u/2+s);
		fill c withcolor
		if is_black[i][j]: .3white
		else: .7white
		fi;
	endfor;
endfor;
endfig;
end.


More information about the metapost mailing list