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
>