       Re: The two dices

• To: mathgroup at smc.vnet.net
• Subject: [mg54524] Re: [mg54486] The two dices
• From: "Dr A.H. Harker" <a.harker at ucl.ac.uk>
• Date: Tue, 22 Feb 2005 04:23:52 -0500 (EST)
• Sender: owner-wri-mathgroup at wolfram.com

```I thought I had an answer to this, but now I realise I don't understand it.

This is the sort of problem that can occur in any programming language
with a function that has hidden side-effects. Random[] can only work by
squirreling away in memory a number to which it is going to apply an
algorithm in order to generate the next pseudo-random number in the sequence
(this number is the variable \$RandomState). What you have to do is to give
Mathematica some clue that this is going on in the background, otherwise
when it comes to try to optimise things one call of dice[] looks as if it
should be exactly another. Something like Update[] wrapped around the call
would be nice, but Update[] only works with Symbols, and dice[] cannot be
defined as a Symbol. One way I can see is

theThrows = Table[Block[{}, dice[]] + Block[{}, dice[]], {n}];
(note, though, that you do NOT want to use Block[{\$RandomState},dice[]]),

but there may be other ways of signalling to Mathematica that the calls to
dice[], apparently with identical arguments, produce different results. For
example, if you define
dice[___] := Random[Integer, {1, 6}]
you can still call it with no arguments, but it is handled correctly. A
look with Trace shows that the evaluation sequence is different with dice[]
and dice[___].

There are two problems with the above argument. One is that Mathematica
does not have any problem if one uses
theThrows = Table[Random[Integer, {1, 6}] + Random[Integer, {1, 6}], {n}];
and the other is that it does not have any problem with
i = 1
dd[] := i = i + 1
Table[dd[] + dd[], {i, 1, n}]
which one would have expected to fall victim to the same difficulty.

Where is the problem then? It's not a matter of compiling (does Table
switch on compilation when the number of iterations exceeds some critical
number, such as 249?), as Compile[{},dice[]+dice[]] produces compiled code
that generates even and odd results.

Tony Harker
Department of Physics and Astronomy
University College London
Gower Street
LONDON
WC1E  6BT
(44)(0)207 679 3404
a.harker at ucl.ac.uk

]->-----Original Message-----
]->From: Antoine [mailto:bugaboo12703 at yahoo.fr]
To: mathgroup at smc.vnet.net
]->Sent: 21 February 2005 08:45
]->To: mathgroup at smc.vnet.net
]->Subject: [mg54524] [mg54486] The two dices
]->
]->Hello,
]->
]->I wanted to simulate the throws of two dices and something happened I
]->can't
]->explain:
]->(Mathematica 5.0 , the same occurs on Mathematica 5.1 )
]->
]->
]->The following code is OK:
]->
]->
]->n=300;
]->theThrows = Table[Random[Integer, {1, 6}] + Random[Integer, {1, 6}],
]->{n}];
]->theStats = Table[Count[theThrows, i], {i, 2, 12}]
]->
]->
]->the occurences, as n becomes greater and greater, looks like the Gaussian
]->curve
]->(sorry for my English)
]->
]->
]->Suppose you want your dice function, and that it is defined by
]->
]->
]->dice[]:=Random[Integer, {1, 6}]  ( nothing wrong about it, I suppose )
]->
]->
]->Now the behavior of the following code changes depending on the value of
]->n.
]->If n < 250 everything is fine ...
]->hen n >= 250, then there is no occurence of odd values.
]->( the two dices never give 3, 5, ....)
]->
]->
]->n=250;
]->theThrows = Table[dice[] + dice[], {n}];
]->theStats = Table[Count[theThrows, i], {i, 2, 12}]
]->
]->
]->Does a rationnal explanation exists ?  Is it a bug ?
]->
]->
]->The two definitions ( see below ) of the dice function "makes" the code
]->running properly.
]->But, of course, I prefer the former definition.
]->
]->
]->dice:=Random[Integer, {1, 6}]  ( not so nice, specially if you want to
]->have
]->several dice functions)
]->dice[_]:=Random[Integer, {1, 6}]   ( you must give a parameter to the
]->function, quite horrible )
]->
]->