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)

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:
 
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]
 
--Tikkanz 01:20, 14 September 2009 (UTC)