On Sat, 05 Jan 2013 12:45:01 -0800, Jennifer Murphy <JenMurphy@jm.invalid> wrote:
>On Sat, 05 Jan 2013 11:47:09 -0600, David C. Ullrich ><email@example.com> wrote: > >>On Fri, 04 Jan 2013 15:08:19 -0800, Jennifer Murphy >><JenMurphy@jm.invalid> wrote: >> >>>I have a little Word macro that will assign a random color from the >>>entire 16M color palette to each letter in a text string. It does this >>>by selecting a random number on (0,255) for each of the RGB colors. >>> >>>The VBA code is: >>> >>> Sub MyRandCharColors() >>> Dim oChr As Range >>> Dim sngR As Single, sngG As Single, sngB As Single >>> Randomize >> >>A comment that has nothing to do with your question: >>That call to Randomize is wrong! > >It may not be optimal, but I don't think it's wrong. > >>It's a common thing, people calling Randomize, or the >>equivalent in another language, in the body of a >>function like this, thinking that the more calls to >>Randomize the better. > >How do you know what "people", or more specifically I, think or why the >call was put where it was?
Sorry. You're right, I was wrong.
The error I was talking about is an error I've seen many people make, including professional programmers (there was this poker site, people were complaining about the funny shuffle, the guys published their shuffling algorithm. Various people pointed out various problems, including this one.)
I should have read more carefully. For some reason I thought that this macro was called in a loop, once for each pixel. If so it would be wrong, for reasons I explained. But no, the loop is inside the macro, after the Randomize. No problem with that.
>A little presumptuous, don't you think? Also >a little condescending. > >In my case, you are incorrect. > >>But in fact you should call >>Randomize only _once_ in the course of the application! >>Call Randomize in whatever routine VBA has for >>initializing things (FormCreate or something). >> >>You think calling Randomize over and over is >>making things more random, > >There you go again. How do you know what I think?
I mistakenly" know" what you think based on my careless reading of the code. If you actually were calling Randomize _inside_ a loop it's hard to see what other reason there could be.
>I do not think that >calling Randomize more than once will somehow (magically) make things >more random. > >>but it actually >>makes things _less_ random. The story: >>Randomize sets some "seed" based on the >>system clock. Once that seed is set, repeated >>calls to Rnd return a sequence of quasi-random >>numbers, starting with he seed. > >Yes, I knew that, as, I imagine, do most "people". > >>Luckily VBA is slow. But the same principle >>applies: Imagine this is some fast compiled >>language. You call Randomize, the seed gets >>set. The next time you call MyRandCharColors, >>the clock hasn't ticked yet, so you reset >>the seed to the same as you set it the >>first time! So your second call to MyRandCharColors >>gives exactly the same colors as the first call. > >In this application, that can never happen even if VBA were >instantaneous. Most of the time, I run the marco only once. The only >times that I run it more than once is if I don't like the colors that >result. That takes me at least a few seconds to determine. I'm pretty >sure that the clock is ticking at something like millisecond frequency. > >>If you haven't noticed this problem it's because >>VBA is so slow. But regardless, only _one_ call >>to Randomize, at the start of the application, >>will make the colors more random. Honest. > >In theory (or principle), I agree with you. In this quick and dirty >application to make multi-colored titles for greeting cards, it makes >absolutely no difference.