# Talk:Seven-sided dice from five-sided dice

From Rosetta Code

## dead link[edit]

The Stack Overflow link in the task description is dead --Thu Apr 10 20:57:05 PDT 2014

## [edit]

It's more common for computer random number generators to generate a random number from 0 to n-1, than from 1 to n. So I propose changing the definitions of dice5() and dice7() to generate integers from 0..4 and 0..6, respectively. It will make the math a little simpler. --96.238.211.175 08:26, 9 August 2009 (UTC)

- Hi, please don't change this as it is more common for dice to count from 1. It is better to make the program adapt to the problem in this case. --Paddy3118 08:56, 9 August 2009 (UTC)

- As noted in the Tcl explanatory text, this is explicitly about making a primitive D5 and creating a D7 from it. (That's also why I use the terms D5 and D7; what programmer hasn't played at least
*some*D&D? :-)) In any case, no conventional die (the correct singular form of “dice”) numbers from 0. —Donal Fellows 10:04, 9 August 2009 (UTC) - I'm probably the exception that proves the rule about D&D. (My great time waster was PacMan)! --Paddy3118 11:10, 9 August 2009 (UTC)

- As noted in the Tcl explanatory text, this is explicitly about making a primitive D5 and creating a D7 from it. (That's also why I use the terms D5 and D7; what programmer hasn't played at least

## J solution seems ugly[edit]

I'd really like someone knowledgeable to look and make J solution more elegant. This straightforward solution doesn't look very good. Avmich 21:03, 13 September 2009 (UTC)

- You could use this
`dice5`

and either`dice7a`

or`dice7b`

for the main bit:

dice5=: >:@:[email protected]$&5

dice7a=: 0 8 -.~ 3 >[email protected]%~ 5 #. [: <:@dice5 2 ,~ */

dice7b=: [: (#~ 7&>:) 3 >[email protected]%~ [: 5&#.&.:<:@dice5 */ , 2:

- Then it's just a question on ensuring that you've got enough rolls. You could use the following explicit:

dice7=: monad define

res=. 0$0

while. (*/y) > #res do.

res=. res, dice7a >. 0.75 * y

end.

y $ res

)

- ...or you could create a tacit equivalent using the
`^:`

conjunction.--Tikkanz 00:15, 14 September 2009 (UTC)

- Here is a more instructive version of the main bit of code:

--Tikkanz 01:20, 14 September 2009 (UTC)

dice5=: [: >: ] [email protected]$ 5: NB. makes a y shape array of 5s, "rolls" the array and increments.

rolltwice=: [: dice5 2 ,~ */ NB. rolls dice5 twice for each desired dice7 roll (*/y rows, 2 cols)

base5to10=: 5 #. <: NB. decrements and converts rows from base 5 to 10

keepgood=: #~ 21&> NB. compress out values not less than 21

groupsof3=: [: >. >: % 3: NB. increments, divides by 3 and takes ceiling

dice7c=: [email protected]@[email protected]