Re: For Loop and Array related
- To: mathgroup at smc.vnet.net
- Subject: [mg58015] Re: For Loop and Array related
- From: Paul Abbott <paul at physics.uwa.edu.au>
- Date: Thu, 16 Jun 2005 06:43:50 -0400 (EDT)
- Organization: The University of Western Australia
- References: <d8oucl$t6q$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
In article <d8oucl$t6q$1 at smc.vnet.net>,
"mchangun at gmail.com" <mchangun at gmail.com> wrote:
> I have an array with 100 elements, all set to zero initially. Then I
> want to randomly choose one element and increase its value by one, and
> repeat this 16000 times. Here is my code:
>
> Lattice = Table[0, {n, 100}];
> For[i = 1, i = 16000, i++, Lattice[[Random[Integer, {1, 100}]]]++]
>
> So now if I add all the elements in the list Lattice together, I should
> get 16000 (I use Total[Lattice] to get the sum of the list). But this
> doesn't happen, and strangely, each time I run this, the sum of the
> list is different! What am I doing wrong?
A syntax error (use of == vs. =) and a subtlety. Here is the modified
code:
Lattice = Table[0, {n, 100}];
SeedRandom[1];
Module[{t}, For[i = 1, i <= 16000, i++,
t = Random[Integer, {1, 100}]; Lattice[[t]]++]];
Lattice
I've included SeedRandom[1]; so that we get a "repeatable" random
sequence.
Note the use of the local variable t. If you write
Lattice[[Random[Integer, {1, 100}]]]++
then, essentially, you are evaluating
Lattice[[Random[Integer, {1, 100}]]] =
Lattice[[Random[Integer, {1, 100}]]] + 1
which involves two _different_ random numbers.
> Also I'm aware that a lot of Mathematica newbies try and write code
> like it were C++ and I think i've fallen into this trap as well. So is
> there a different (more Mathematica) way which I can implement the
> above?
First compute a list of 16000 numbers:
SeedRandom[1]; t = Table[Random[Integer, {1, 100}], {16000}];
Here are three ways to compute Lattice:
[1] Count[t, #]& /@ Range[100]
[2] << "Statistics`";
BinCounts[t, {0, 100}]
[3] Length /@ Split[Sort[t]]
These 3 codes give the same result as above.
The last code will not work with short lists because it does not return
any zero counts.
Cheers,
Paul
--
Paul Abbott Phone: +61 8 6488 2734
School of Physics, M013 Fax: +61 8 6488 1014
The University of Western Australia (CRICOS Provider No 00126G)
AUSTRALIA http://physics.uwa.edu.au/~paul
http://InternationalMathematicaSymposium.org/IMS2005/