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
>

```

• Prev by Date: Re: Relational Operators and Random Integers
• Next by Date: Re: Re: Re: Re: Problem with
• Previous by thread: Re: Relational Operators and Random Integers
• Next by thread: Re: Relational Operators and Random Integers