[Jprogramming] Problem with random numbers
Linda Alvord
lindaalvord at verizon.net
Thu Mar 24 22:43:12 HKT 2011
seed=: (; ; ,:)~ 0 0
seed
----------T---┐
│----T---┐│0 0│
││0 0│0 0││0 0│
│L---+----│ │
L---------+----
seeds=: (; ; ,:) 0 0
seeds
----T---┐
│0 0│0 0│
L---+----
(; 0 0) ; ,: 0 0
----T---┐
│0 0│0 0│
L---+----
In seed the reflexive ~ indicates a dyadic fork. Without it you have
seeds which is a monadic fork. Linda
-----Original Message-----
From: programming-bounces at jsoftware.com
[mailto:programming-bounces at jsoftware.com] On Behalf Of Adrian May
Sent: Thursday, March 24, 2011 7:03 AM
To: Programming forum
Subject: Re: [Jprogramming] Problem with random numbers
Thanks everybody,
You made quite an accurate job of disassembling my program. I can't read it
at all and I wrote it. Here's what I wrote (plus your corrections) before I
squashed it all together to make it look scary and see if I could:
rand =. _1 1 {~ ?@:(2"0)
matmul =. (+/ .*)
avg =. (%&2@:+)
avgio =. (avg &.>)
w =. (><1)&{::
io =. (<0)&{::
ifio =. (<0)&{::
ofio =. (<1)&{::
i =. ifio at io
o =. ofio at io
show =. ([(1!:2&2)@('-+'{~>:&0)@(i,o)) NB. looks nicer now
env =. (rand&[)`(reward&[) @. (-:&goal)
decide =. _1 1 {~ >:&0
think =. w (] ; decide at matmul) env at o
weightlearn =. learnrate@(ofio */ ifio)@((avgio io)~)
weightjumble =. (+ jumblerate at rand)
weightnew =. (weightlearn + (weightjumble at forgetrate@w@[))
cycle =. ((] ; weightnew) think)
cycle at show ^:30 ((0 0;0 0); 2 2 $ 0)
goal =. _1 1
reward =. _1 _1
learnrate =. 0.5&*
forgetrate =. 0.5&*
jumblerate =. 0.2&*
I'm still, still confused about how env's rand knows to make two numbers. In
1-~2*?@:(2"0), the 2"0 means I want 1s and 0s. It doesn't say anything about
how many numbers I want. I know that the vector gets presented to (rand&[)
but I don't see how or why it makes it down to rand. In (2&*) 3 you don't
present the 3 to the 2.
But look what I get in the terminal:
rand
1 -~ 2 * ?@:(2"0)
| (rand&[) (2 2$0)
1 1
1 1
| (rand&[) (2 2$0)
1 1
1 1
| (rand&[) (2 2$0)
1 1
1 1
| (rand&[) (2 2$0)
1 1
1 1
| (rand&[) (2 2$0)
1 1
1 1
| rand (2 2$0)
1 1
1 1
| rand (2 2$0)
1 1
1 1
| rand (2 2$0)
1 1
1 1
| rand (2 2$0)
1 1
1 1
| rand (2 2$0)
1 1
1 1
rand 2 2
_1 _1
rand 2 2
1 1
rand 2 2
_1 1
rand(2 2)
1 _1
rand(2 2)
_1 _1
rand(2 2)
1 _1
?2"0 (2 2$0)
1 0
0 0
?2"0 (2 2$0)
0 1
0 0
What on earth is going on there? I have a hunch that my program isn't giving
random numbers everywhere. I can recognise the symptoms: it takes longer to
learn and sometimes doesn't at all.
I now do the vector comparison with -: but why can't I just use = ?
That combiningFn didn't do quite what I wanted. It's supposed to do a matrix
multiply (nothing's in boxes at that point) then replace everything in the
answer by its sign. That overall sentence afterwards confused me a bit.
I can't seem to make constants work your way. It barfs when I substitute it
in. What would I write in weightlearn if learnrate was 0.5&[ ?
> addrandom =: 13 : 'y + ?x#~#y'
I'm confused. #y counts the elements in y. y+ adds, ?x rolls. But what's #~
A lot of these things don't seem to be in the vocabulary. {~ wasn't either.
The incredible thing about this language is that I never needed to call
anything twice (except accessors). Those forks and hooks did everything I
could have asked for in a single sentence. And it's eminently readable too.
Adrian.
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
More information about the Programming
mailing list