This took me much longer than a lunch-break, partly because we
were away in France, and I was experimenting with J701 on my
iPad when Liz would let me.
I came up with a number of variants, of which the following is best.
It's slower and uses more space than Raul's for small problem-sizes,
but is perhaps better for larger problems, eg n > 100 or so.
NB. a Boolean verb for whether a player donates, which,
NB. of course, depends on whether he has any money:
donation =: 1 & <.
NB. This verb lists the indexes of the random donee (? player donated to)
NB. for each player, whether of not that player CAN donate.
NB. It assumes that its single argument is i.n where n is the number
NB. of players, which is why its name ends in i (!):
idoneei=:(#|(+?&.<:@#~@#))
NB. The idea is to concatenate
NB. (the old state minus donation) and (donation), namely
NB. ((-, ])donation)
NB. and sum them as ordered with this left-hand key:
NB. (i.n) concatenated with (idonee), namely
NB. (, idoneei)@(i.@#)
NB. Here it is, with a fix, f.
new =: ((,idoneei)@(i.@#) +//. ((-, ])donation )) f.
NB. time & space:
ts =: 6!:2 , 7!:2@]
NB. where my version is ok:
ts'orig ^:5000 #~200' NB. Xiao-Yong Jin's original suggestion
5.72563 22912
ts'tick ^:5000 #~200' NB. Raul's revised version
1.57339 77824
ts'new ^:5000 #~200' NB. The best I could manage
0.922963 20992
NB. and where it isn't so good:
ts'orig ^:5000 #~10' NB. Xiao-Yong Jin
0.341718 6272
ts'tick ^:5000 #~10' NB. Raul M
0.0445439 3840
ts'new ^:5000 #~10' NB. Mike D
0.0676198 4864
Sorry for this late posting, but it wasn't convenient to
write up and send until home and with laptop to hand.
Thanks,
Mike
NB. prepared in notepad, copied to Thunderbird, and trying
to force fixed width - hope it displays reasonably.
On 11/07/2017 19:33, Devon McCormick wrote:
Reading the page referenced, I see where I was confused. The problem
starts out as 100 people each with $100, but then solves a variant of it
for 45 people with $45 each, possibly so the animation is legible. It's
not clear why they even mention the first set of numbers.
On Mon, Jul 10, 2017 at 8:37 PM, Raul Miller <rauldmil...@gmail.com> wrote:
Oops, I did not think about that "reflexive giving" wart.
Here's a fix for my version:
tick=: (0 >. <:) + i.@# +/@:(=/)~ I.@:* (] + <:) +/@:* ?@# <:@#
require 'stats'
stddev"1 tick^:(i.10) 45#45
0 0.977008 1.18705 1.73205 2.01133 2.15322 2.46798 2.86832 2.97719 3.1334
tick^:10000]20#20
3 20 1 15 10 38 6 8 23 24 11 90 33 67 5 13 7 20 1 5
Thanks,
--
Raul
On Mon, Jul 10, 2017 at 7:50 PM, 'Pascal Jasmin' via Programming
<programm...@jsoftware.com> wrote:
The number of $ available each round is the number of people with >&0.
The number of potential recipients is the population. This simplification
though means its possible for someone to pay himself.
A correction to your version,
/:~@(-&1`]@.(=&0)"0 (#/.~@] + ~.@]{[)`(~.@])`[} >&0 # (?@#~@#@]`]`[} ]
I.@:= i.@#)@?@#~@#)^:21000 #~10
That assumption would increase the likelihood of eventual
"superconcntration" but that doesn't seem to happen.
As soon as some have 0, the rest have a "negative return" expectation
each turn.
________________________________
From: Xiao-Yong Jin <jinxiaoy...@gmail.com>
To: "programm...@jsoftware.com" <programm...@jsoftware.com>
Sent: Monday, July 10, 2017 3:43 PM
Subject: [Jprogramming] Everyone giving dollars to random others
I thought this is a good lunch break exercise.
http://www.decisionsciencenews.com/2017/06/19/counterintuitive-
problem-everyone-room-keeps-giving-dollars-random-others-
youll-never-guess-happens-next/
Quote: “Imagine a room full of 100 people with 100 dollars each. With
every tick of the clock, every person with money gives a dollar to one
randomly chosen other person. After some time progresses, how will the
money be distributed?”
And I came up with this simulation. (45 people with 45 dollars each,
same as on the webpage.)
/:~@(-&1`]@.(=&0)"0 (#/.~@] + ~.@]{[)`(~.@])`[} >&0 # (?@#~@#@]`]`[} ]
I.@:= i.@#)^:_@?@#~@#)^:5000 #~45
And I really like to see the mean expectations and the standard
deviation of the mean, I ended up doing this. (Make sure the J sentence is
one long line if you want to try it out.)
((],.[:(+/%#*<:@#)&.:*: -"1)+/%#)}.(/:~@(-&1`]@.(=&0)"0 (#/.~@] +
~.@]{[)`(~.@])`[} >&0 # (?@#~@#@]`]`[} ]I.@:=i.@#)^:_@?@#~@#)^:10000)^:(<65)
#~45
0.984375 0.124984
2.01562 0.170335
3.0625 0.180765
4.15625 0.230616
5.21875 0.248476
6.1875 0.306894
7.35938 0.332862
8.64062 0.362809
9.84375 0.380723
10.9688 0.383805
12.125 0.407944
13.6406 0.423964
15.0625 0.457453
16.5312 0.462893
18.1875 0.480717
19.7031 0.464877
21.1562 0.475709
22.7031 0.483702
24.4062 0.516935
26.4062 0.5768
28.1094 0.604266
29.8281 0.617838
31.875 0.61942
33.9375 0.603345
35.7812 0.642211
37.9844 0.647987
40.6562 0.731321
43 0.739342
45.3906 0.723616
48.0469 0.7613
51.6094 0.823639
54.7656 0.873934
57.1406 0.815544
60 0.866598
63.8594 0.898319
68.75 0.918018
73.5781 1.00736
78.3281 1.08128
84.9688 1.25534
93.4688 1.29731
104.578 1.73274
114.922 2.07574
131.938 2.7357
159.359 4.40899
204.766 7.24239
So, how do I make a fancy animation (like the one in the webpage I
linked in the beginning of this message) with J?
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm