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