src/sn-evolution2.c: Clean up the mutation probability a bit.
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Thu, 12 Mar 2009 17:13:40 +0000 (18:13 +0100)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Thu, 12 Mar 2009 17:13:40 +0000 (18:13 +0100)
src/sn-evolution2.c
src/sn_random.c
src/sn_random.h

index 62a0969..907c05f 100644 (file)
@@ -265,22 +265,20 @@ static sn_comparator_t get_random_comparator (void) /* {{{ */
 static int mutate_network (sn_comparator_t *comparators, int comparators_num)
 {
   static int old_comparators_num = -1;
-  static int cut_off = 1000000;
+  static double mutate_probability = 0.0;
 
   int i;
 
   if (old_comparators_num != comparators_num)
   {
-    double p;
-
-    p = powl (0.5, (1.0 / ((double) comparators_num)));
-    cut_off = (int) (((double) 1000000) * p);
-
+    /* Probability that NO mutation takes place: 1/3 */
+    mutate_probability = powl (1.0 / 3.0, (1.0 / ((double) comparators_num)));
     old_comparators_num = comparators_num;
   }
 
+  /* `mutate_probability' actually holds 1-p, i. e. it is close to one */
   for (i = 0; i < comparators_num; i++)
-    if (sn_bounded_random (0, 1000000) >= cut_off)
+    if (sn_double_random () >= mutate_probability)
       comparators[i] = get_random_comparator ();
 
   return (0);
index 841b6e4..1c885aa 100644 (file)
@@ -144,4 +144,9 @@ int sn_bounded_random (int min, int max)
   return (rand);
 } /* int sn_bounded_random */
 
+double sn_double_random (void)
+{
+  return (((double) sn_random ()) / (((double) RAND_MAX) + 1.0));
+} /* double sn_double_random */
+
 /* vim: set shiftwidth=2 softtabstop=2 : */
index 5143264..ed89cc7 100644 (file)
@@ -26,5 +26,6 @@ int sn_random (void);
 int sn_true_random (void);
 
 int sn_bounded_random (int min, int max);
+double sn_double_random (void);
 
 #endif /* SN_RANDOM_H */