Re: Relational Operators and Random Integers
- To: mathgroup at smc.vnet.net
- Subject: [mg90339] Re: Relational Operators and Random Integers
- From: "David Park" <djmpark at comcast.net>
- Date: Sun, 6 Jul 2008 07:20:11 -0400 (EDT)
- References: <g4ncm0$gd3$1@smc.vnet.net>
Pete, First, the x you have before the Which statement is irrelevant. It returns a random choice but has nothing to do with the 'x's that are in the Which statement. Note that Which has the attribute HoldAll. Attributes[Which] {HoldAll, Protected} Then read carefully the Help for Which. It evaluates each of the tests in turn (and each time uses a new random choice for x) and then returns the first case that is True. It also means that it may not get a hit because each new generation of x may miss its particular case. Evaluate the following repeatedly. Which[x == 1, 1, x == 2, 2, x == 3, 3, True, "No hit"] Or better yet, evaluate the following where you can see what is going on at each step. Which[ Print[xfix = x]; xfix == 1, 1, Print[xfix = x]; xfix == 2, 2, Print[xfix = x]; xfix == 3, 3, True, "No hit"] You could use the Switch statement as follows: Switch[xfix = x, 1, 1, 2, 2, 3, 3] or you could use a Module to fix the value to a single random choice: Module[{xfix = x}, Print[xfix]; Which[xfix == 1, 1, xfix == 2, 2, xfix == 3, 3, True, "No hit"]] Or you could use a trick with the With statement. With calculates the internal value of x by evaluating the external value and then replaces that single value everywhere within the With statement and only then evaluates the statements. With[{x = x}, Print[x]; Which[x == 1, 1, x == 2, 2, x == 3, 3, True, "No hit"]] -- David Park djmpark at comcast.net http://home.comcast.net/~djmpark/ "Peter Evans" <peter.w.evans at gmail.com> wrote in message news:g4ncm0$gd3$1 at smc.vnet.net... > Hi all, > > I'm a new user of Mathematica 6 and am struggling with some basics. I wish > to write a set of rules which are dependent upon a random variable. I've > been using RandomChoice to choose my variable and then large If and Which > statements to produce my desired dynamics. > > The problem is that the number that these statements end up spitting out > aren't recognised as what they are in further If and Which statements. > Here's a simple example that demonstrates my problem: > > In[1]:= x := RandomChoice[{1, 2, 3}] > x > Which[x == 1, 1, x == 2, 2, x == 3, 3] > > Out[2]= 1 > > Out[3]= 2 > > Mathematica clearly thinks x to be 1 but the If statement indicates its 2. > What am I doing wrong here? > > Much thanks, > > Pete >