[Insight-users] Missing use of ReinitializeSeed in MutualInfo. metric?

Erik Harg Erik.Harg at idi.ntnu.no
Mon May 2 05:03:43 EDT 2005

On Sat, 30 Apr 2005, Karthik Krishnan wrote:

> Hi Erik,
> You may also include quasi-random initialization if you like as in
> metric->ReinitializeSeed(vcl_ctime(0));
Thanks for your reply, Karthik. I have included, now, a call to the 
seeding function of the metric in my program...

> A default seed is supplied during the first call to drand by most compilers 
> except the cygwin-gcc, which was why the function was added, so you could 
> call it explicitly from your code. The metric constructor doesn't use it to 
> ensure that testing is consitent.
I would have to confess that I had not thought about the test suite's 
requirements for consistent and deterministic results. However, I would 
still naïvely think that this could be obtained by a call to the 
ReinitializeSeed() in the metric constructor, and then (subsequently) do 
the crude fixed-number initialization of the random number generator 
*only* in the testing framework?

I should hurry to point out that I have not even looked at the ITK test 
suite, so I'm a little out on a limb here.

> The MersenneTwister was  added to ITK recently and is generally 1-6 times 
> faster than its vnl counterpart (except on the SGIs ?? ) and it exhibits more 
> randomness too.
And that, I guess, is for the internal use in e.g. the 

Thanks again, Karthik, for your reply.


> Erik Harg wrote:
>> Hi,
>> I have a question regarding the randomness (or, rather, the lack of it) of 
>> the random number generator in ImageRandomConstIteratorWithIndex, as used 
>> in the MutualInformationImageToImageMetric.
>> In my experience, with the same number of sample points, and the same 
>> fixed/moving images, the Iterator always chooses the same sample points, 
>> and the resulting MI metric values are always identical. This is occurring 
>> both under Mac OS X and Linux, using itk versions from 1.8 to 2.0.
>> As far as I can tell, when the MutualInformationImageToImageMetric calls 
>> the ++randIter, the increment operator of the ImageConstIteratorWithIndex 
>> calls RandomJump(), which in turn uses vnl_sample_uniform(). However, I 
>> have not been able to find any preceding call to the reseed function of 
>> the iterator, nor directly to the vnl_sample_reseed() functions. [1]
>> In the almost 6 months I have been watching this list, some threads 
>> related to this issue have emerged, but (I believe) not covering exactly 
>> what I am thinking about...
>> My question then, is this: Am I correct in noticing that the 
>> MutualInformation Metric does not seed the random number generator, and is 
>> there a good reason for it not to use its own ReinitializeSeed() function 
>> (or the one in the Iterator)?
>> I notice that in some of the RegistrationExamples included with the itk 
>> source, there are specific calls to vnl_sample_reseed(int seed), using 
>> seed=8775070 or 76926294. However, wouldn't it be a more general approach 
>> to let the MI metric, or even the Iterator, handle the seeding, to ensure 
>> that the correct function is called?
>> There is probably a good answer to this, and I am looking forward to 
>> hearing it! Thank you.
>> Regards,
>> Erik
>> [1]
>> Looking at the source code for the vnl (vnl_sample.cxx in the 
>> Utilities/vxl/core/vnl directory of the itk source tree), it seems that 
>> this function will either use the drand48() stdlib function if available, 
>> or use a simple congruential random number generator. As far as my 
>> understanding of (pseudo-)random number generators go, both of these need 
>> a decent seed to provide anything close to random numbers. The 
>> congruential generator that is built into the vnl has a static seed of 
>> 12345, unless a call to vnl_sample_reseed() or vnl_sample_reseed(int seed) 
>> precedes the vnl_sample_uniform() function call. However, when vnl is 
>> using the drand48(), no default seeding (using srand48()) is done, and I 
>> believe the last system provided seed is used(?). Thus, any call to 
>> vnl_sample_uniform() should be preceded by a call to vnl_sample_reseed() 
>> (which uses the vcl_time(0) as seed to srand48()), or to 
>> vnl_sample_reseed(int seed) using some user defined seed. Only this will 
>> ensure a basic pseudo-random behaviour of the uniform random number 
>> generator, I believe.
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users

       | Erik Harg         924 98 541       Erik.Harg at idi.ntnu.no |
       |                NTNU - Trondheim                          |

More information about the Insight-users mailing list