Re: Question about RandomInteger
- To: mathgroup at smc.vnet.net
- Subject: [mg83179] Re: [mg83153] Question about RandomInteger
- From: Darren Glosemeyer <darreng at wolfram.com>
- Date: Wed, 14 Nov 2007 04:43:32 -0500 (EST)
- References: <200711130838.DAA27746@smc.vnet.net>
John wrote:
> Needs["MultivariateStatistics`"]
> n=1000
> pdpd={1/6,1/6,1/6,1/6,1/6,1/6}
> pdid={1/7,1/5,1/6,1/6.1/6,33/210}
> u=RandomInteger[MultinomialDistribution[n,pdpd],1]
> v=RandomInteger[MultinomialDistribution[n,pdid],1]
>
> All of the above works.
>
> But u and v appear more than once in subsequent calculations, and
> RandomInteger reexecutes at each appearance. The reexecutions change
> the values of u and v, and that is not what I want to happen.
>
> Any advice will be appreciated.
>
> John
>
>
As defined, RandomInteger will not be re-evaluated each time u and v are
used within the same session.
In[1]:= Needs["MultivariateStatistics`"]
In[2]:= n = 1000;
In[3]:= pdpd = {1/6, 1/6, 1/6, 1/6, 1/6, 1/6};
In[4]:= pdid = {1/7, 1/5, 1/6, 1/6, 1/6, 33/210};
In[5]:= u = RandomInteger[MultinomialDistribution[n, pdpd], 1]
Out[5]= {{155, 188, 170, 174, 162, 151}}
In[6]:= v = RandomInteger[MultinomialDistribution[n, pdid], 1]
Out[6]= {{133, 220, 167, 176, 170, 134}}
Here we see that u and v do not change when evaluated.
In[7]:= {u, u, u}
Out[7]= {{{155, 188, 170, 174, 162, 151}}, {{155, 188, 170, 174, 162,
151}},
> {{155, 188, 170, 174, 162, 151}}}
In[8]:= {v, v, v}
Out[8]= {{{133, 220, 167, 176, 170, 134}}, {{133, 220, 167, 176, 170,
134}},
> {{133, 220, 167, 176, 170, 134}}}
My best guess, without seeing the actual example where re-evaluation
occurs, is that either the entire assignment is re-evaluated in the code
(e.g. the subsequent calculations use u =
RandomInteger[MultinomialDistribution[n, pdpd], 1] rather than just u),
or the definitions actually used SetDelayed (:=) rather than Set (=).
With a SetDelayed definition the right-hand side of the definition will
be re-evaluated each time the left-hand side is used.
In[9]:= u2 := RandomInteger[MultinomialDistribution[n, pdpd], 1]
In[10]:= v2 := RandomInteger[MultinomialDistribution[n, pdpd], 1]
In[11]:= {u2, u2, u2}
Out[11]= {{{154, 145, 185, 172, 170, 174}}, {{173, 166, 142, 184, 188,
147}},
> {{177, 164, 172, 152, 168, 167}}}
In[12]:= {v2, v2, v2}
Out[12]= {{{174, 171, 167, 165, 177, 146}}, {{186, 160, 165, 175, 166,
148}},
> {{150, 163, 173, 178, 166, 170}}}
If consistent values are needed across sessions or there is a need to
re-evaluate the assignments to u and v in your application, BlockRandom
and SeedRandom can be used as others have suggested.
Darren Glosemeyer
Wolfram Research
- References:
- Question about RandomInteger
- From: John <jwa0@lehigh.edu>
- Question about RandomInteger