That is very close to what I came up with, for the case where we want only
a single value from our result:

   d6=:1 + ? bind 6
   repd6=: [:+/(,d6)^:(6={:)@d6

Here's a variation on Roger Hui's approach, for the case where we want N
values from our result:

d6s=: 1 + [: ? #&6
bulk=:{.#&0(],~(+/;.1~1:}:@,0~:6&|)@(],d6s@[))^:(0=6&|@{:@{.)^:_~]

Example use:
   bulk 20
5 5 5 4 3 3 2 3 3 9 1 4 16 3 3 1 3 17 3 4

This would probably be much clearer if implemented explicitly rather than
tacitly, and probably would be more efficient also. So:

bulkd6s=:3 :0
  r=. i. 0
  while. y >: #r do.
    r=. r, d6s y
    mask=. }: 1, 0~:6|r
    r=. mask +/;.1 r
  end.
  y{.r
)

But statistically speaking, this is still not as efficient as it could be.
I think we'd do better with:

bulkd6=:3 :0
  r=. i. 0
  while. y >: #r do.
    r=. r, d6s 2*y
    mask=. }: 1, 0~:6|r
    r=. mask +/;.1 r
  end.
  y{.r
)

Do you see why this tends to be more efficient?

Thanks,

-- 
Raul


On Thu, Sep 25, 2014 at 11:50 AM, 'Pascal Jasmin' via Programming <
programm...@jsoftware.com> wrote:

> this works
>
> (, >:@?@6:)^:((0=#) +. 6={:)^:_ i.0
>
>    ([: +/ (, >:@?@6:)^:((0=#) +. 6={:)^:_) i.0
> 11
>
>
>
> ----- Original Message -----
> From: Johann Hibschman <jhibsch...@gmail.com>
> To: Programming forum <programm...@jsoftware.com>
> Cc:
> Sent: Thursday, September 25, 2014 9:06 AM
> Subject: [Jprogramming] Repeated rolling dice
>
> Hi all,
>
> For fun, I've been running some statistics for a game with an unusual
> rule for rolling dice: if a 6 is rolled, roll again and add the
> result, repeating on any subsequent 6s. I wanted to implement this in
> J, collecting all the individual rolls (rather than just the sum.)
>
> It seems like there should be a more clever and elegant way to do
> this, but this is what I have:
>
> NB. Simple roll.
> roll0 =: >:@?
>
> NB. This seems to work, but it's not very clever.
> roll =: 3 : 0
>   r =. >:?y
>   if. r=y do. r=. r,(roll y) end.
>   r
> )
>
> NB. Attempt at iterating via power.  Fails because repeats
> NB. signal termination.
> roll0^:(6&=)^:(<_) 6
>
> NB. Attempt at iterating via agenda.  Not even close yet.
> NB. ]`(]+$:) @. (=&6)  NB. where to stick in the roll?
>
> This gives what I expect:
>
>    roll"0 ] 10#6
> 6 1 0
> 3 0 0
> 3 0 0
> 2 0 0
> 5 0 0
> 2 0 0
> 6 6 2
> 2 0 0
> 1 0 0
> 6 3 0
>
> But is there a better way to do this? Also, are there any known issues
> with the RNG? I've not gathered enough statistics to prove it, but the
> results look clumpier (more identical values in a row) than I expect.
> Now, I know that's a common cognitive bias, so it may just be me, but
> is there a discussion of the quality of the RNG somewhere?
>
> Thanks,
> Johann
> ----------------------------------------------------------------------
> 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

Reply via email to