Moved struct declaration up. Style fixes.
authorSebastian Wilhelmi <wilhelmi@ira.uka.de>
Mon, 12 Apr 1999 12:53:37 +0000 (12:53 +0000)
committerSebastian Wilhelmi <wilhelmi@src.gnome.org>
Mon, 12 Apr 1999 12:53:37 +0000 (12:53 +0000)
1999-04-12  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

* glib.h: Moved struct declaration up. Style fixes.

* grand.c: Style fixes. Only try to open /dev/random once.

* tests/rand-test.c (main): New tests; Slight bug fix.

13 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
glib.h
glib/glib.h
glib/grand.c
grand.c
tests/rand-test.c

index 90d5314..0f46297 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+1999-04-12  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * glib.h: Moved struct declaration up. Style fixes.
+
+       * grand.c: Style fixes. Only try to open /dev/random once.
+
+       * tests/rand-test.c (main): New tests; Slight bug fix. 
+
 1999-04-09  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * grand.c, tests/rand-test.c: New files to implement the Mersenne
index 90d5314..0f46297 100644 (file)
@@ -1,3 +1,11 @@
+1999-04-12  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * glib.h: Moved struct declaration up. Style fixes.
+
+       * grand.c: Style fixes. Only try to open /dev/random once.
+
+       * tests/rand-test.c (main): New tests; Slight bug fix. 
+
 1999-04-09  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * grand.c, tests/rand-test.c: New files to implement the Mersenne
index 90d5314..0f46297 100644 (file)
@@ -1,3 +1,11 @@
+1999-04-12  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * glib.h: Moved struct declaration up. Style fixes.
+
+       * grand.c: Style fixes. Only try to open /dev/random once.
+
+       * tests/rand-test.c (main): New tests; Slight bug fix. 
+
 1999-04-09  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * grand.c, tests/rand-test.c: New files to implement the Mersenne
index 90d5314..0f46297 100644 (file)
@@ -1,3 +1,11 @@
+1999-04-12  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * glib.h: Moved struct declaration up. Style fixes.
+
+       * grand.c: Style fixes. Only try to open /dev/random once.
+
+       * tests/rand-test.c (main): New tests; Slight bug fix. 
+
 1999-04-09  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * grand.c, tests/rand-test.c: New files to implement the Mersenne
index 90d5314..0f46297 100644 (file)
@@ -1,3 +1,11 @@
+1999-04-12  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * glib.h: Moved struct declaration up. Style fixes.
+
+       * grand.c: Style fixes. Only try to open /dev/random once.
+
+       * tests/rand-test.c (main): New tests; Slight bug fix. 
+
 1999-04-09  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * grand.c, tests/rand-test.c: New files to implement the Mersenne
index 90d5314..0f46297 100644 (file)
@@ -1,3 +1,11 @@
+1999-04-12  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * glib.h: Moved struct declaration up. Style fixes.
+
+       * grand.c: Style fixes. Only try to open /dev/random once.
+
+       * tests/rand-test.c (main): New tests; Slight bug fix. 
+
 1999-04-09  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * grand.c, tests/rand-test.c: New files to implement the Mersenne
index 90d5314..0f46297 100644 (file)
@@ -1,3 +1,11 @@
+1999-04-12  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * glib.h: Moved struct declaration up. Style fixes.
+
+       * grand.c: Style fixes. Only try to open /dev/random once.
+
+       * tests/rand-test.c (main): New tests; Slight bug fix. 
+
 1999-04-09  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * grand.c, tests/rand-test.c: New files to implement the Mersenne
index 90d5314..0f46297 100644 (file)
@@ -1,3 +1,11 @@
+1999-04-12  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * glib.h: Moved struct declaration up. Style fixes.
+
+       * grand.c: Style fixes. Only try to open /dev/random once.
+
+       * tests/rand-test.c (main): New tests; Slight bug fix. 
+
 1999-04-09  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * grand.c, tests/rand-test.c: New files to implement the Mersenne
diff --git a/glib.h b/glib.h
index a772fb5..bfd1f49 100644 (file)
--- a/glib.h
+++ b/glib.h
@@ -698,6 +698,7 @@ typedef struct _GMemChunk   GMemChunk;
 typedef struct _GNode          GNode;
 typedef struct _GPtrArray      GPtrArray;
 typedef struct _GQueue         GQueue;
+typedef struct _GRand          GRand;
 typedef struct _GRelation      GRelation;
 typedef struct _GScanner       GScanner;
 typedef struct _GScannerConfig GScannerConfig;
@@ -2378,9 +2379,8 @@ gpointer   g_tuples_index     (GTuples       *tuples,
  * double_range -> [min..max)
  */
 
-typedef struct _GRand GRand;
 GRand*  g_rand_new_with_seed   (guint32     seed);
-GRand*  g_rand_new             ();
+GRand*  g_rand_new             (void);
 void    g_rand_free            (GRand      *rand);
 
 void    g_rand_set_seed        (GRand      *rand, 
@@ -2400,10 +2400,10 @@ gdouble g_rand_normal          (GRand      *rand,
 */
 
 void    g_random_set_seed      (guint32     seed);
-guint32 g_random_int           ();
+guint32 g_random_int           (void);
 gint32  g_random_int_range     (gint32      min, 
                                gint32      max);
-gdouble g_random_double        ();
+gdouble g_random_double        (void);
 gdouble g_random_double_range  (gdouble     min, 
                                gdouble     max);
 /* dito
index a772fb5..bfd1f49 100644 (file)
@@ -698,6 +698,7 @@ typedef struct _GMemChunk   GMemChunk;
 typedef struct _GNode          GNode;
 typedef struct _GPtrArray      GPtrArray;
 typedef struct _GQueue         GQueue;
+typedef struct _GRand          GRand;
 typedef struct _GRelation      GRelation;
 typedef struct _GScanner       GScanner;
 typedef struct _GScannerConfig GScannerConfig;
@@ -2378,9 +2379,8 @@ gpointer   g_tuples_index     (GTuples       *tuples,
  * double_range -> [min..max)
  */
 
-typedef struct _GRand GRand;
 GRand*  g_rand_new_with_seed   (guint32     seed);
-GRand*  g_rand_new             ();
+GRand*  g_rand_new             (void);
 void    g_rand_free            (GRand      *rand);
 
 void    g_rand_set_seed        (GRand      *rand, 
@@ -2400,10 +2400,10 @@ gdouble g_rand_normal          (GRand      *rand,
 */
 
 void    g_random_set_seed      (guint32     seed);
-guint32 g_random_int           ();
+guint32 g_random_int           (void);
 gint32  g_random_int_range     (gint32      min, 
                                gint32      max);
-gdouble g_random_double        ();
+gdouble g_random_double        (void);
 gdouble g_random_double_range  (gdouble     min, 
                                gdouble     max);
 /* dito
index 2725d9f..65f2af2 100644 (file)
@@ -22,6 +22,7 @@
  * code from this file in your own programs or libraries.
  * Further information on the Mersenne Twister can be found at
  * http://www.math.keio.ac.jp/~matumoto/emt.html
+ * This code was adapted to glib by Sebastian Wilhelmi <wilhelmi@ira.uka.de>.
  */
 
 /*
  * GLib at ftp://ftp.gtk.org/pub/gtk/.  
  */
 
+/* 
+ * MT safe
+ */
+
 #include <glib.h>
 #include <math.h>
 #include <stdio.h>
@@ -70,17 +75,25 @@ g_rand_new_with_seed (guint32 seed)
 }
 
 GRand* 
-g_rand_new ()
+g_rand_new (void)
 {
   guint32 seed = 0;
   GTimeVal now;
-  FILE* dev_random = fopen("/dev/random", "rb");
-
-  if (dev_random)
+  static gboolean dev_random_exists = TRUE;
+  
+  if (dev_random_exists)
     {
-      if (fread (&seed, sizeof (seed), 1, dev_random) != 1)
-       seed = 0;
-      fclose (dev_random);
+      FILE* dev_random = fopen("/dev/random", "rb");
+      if (dev_random)
+       {
+         if (fread (&seed, sizeof (seed), 1, dev_random) != 1)
+           seed = 0;
+         else
+           dev_random_exists = FALSE;
+         fclose (dev_random);
+       }       
+      else
+       dev_random_exists = FALSE;
     }
 
   /* Using /dev/random alone makes the seed computable for the
@@ -96,7 +109,7 @@ g_rand_new ()
 void
 g_rand_free (GRand* rand)
 {
-  g_return_if_fail (rand);
+  g_return_if_fail (rand != NULL);
 
   g_free (rand);
 }
@@ -104,7 +117,7 @@ g_rand_free (GRand* rand)
 void
 g_rand_set_seed (GRand* rand, guint32 seed)
 {
-  g_return_if_fail (rand);
+  g_return_if_fail (rand != NULL);
 
   /* setting initial seeds to mt[N] using         */
   /* the generator Line 25 of Table 1 in          */
@@ -124,7 +137,7 @@ g_rand_int (GRand* rand)
   static const guint32 mag01[2]={0x0, MATRIX_A};
   /* mag01[x] = x * MATRIX_A  for x=0,1 */
 
-  g_return_val_if_fail (rand, 0);
+  g_return_val_if_fail (rand != NULL, 0);
 
   if (rand->mti >= N) { /* generate N words at one time */
     int kk;
@@ -158,7 +171,7 @@ g_rand_int_range (GRand* rand, gint32 min, gint32 max)
   guint32 dist = max - min;
   guint32 random;
 
-  g_return_val_if_fail (rand, min);
+  g_return_val_if_fail (rand != NULL, min);
   g_return_val_if_fail (max > min, min);
 
   if (dist <= 0x10000L) /* 2^16 */
@@ -227,7 +240,7 @@ g_rand_normal (GRand* rand, gdouble mean, gdouble standard_deviation)
      Computer Programming", Vol.2, Second Edition, Page 117: Polar
      method for normal deviates due to Box, Muller, Marsaglia */
   gdouble normal;
-  g_return_val_if_fail (rand, 0);
+  g_return_val_if_fail (rand != NULL, 0);
 
   if (rand->have_next_normal) 
     {
diff --git a/grand.c b/grand.c
index 2725d9f..65f2af2 100644 (file)
--- a/grand.c
+++ b/grand.c
@@ -22,6 +22,7 @@
  * code from this file in your own programs or libraries.
  * Further information on the Mersenne Twister can be found at
  * http://www.math.keio.ac.jp/~matumoto/emt.html
+ * This code was adapted to glib by Sebastian Wilhelmi <wilhelmi@ira.uka.de>.
  */
 
 /*
  * GLib at ftp://ftp.gtk.org/pub/gtk/.  
  */
 
+/* 
+ * MT safe
+ */
+
 #include <glib.h>
 #include <math.h>
 #include <stdio.h>
@@ -70,17 +75,25 @@ g_rand_new_with_seed (guint32 seed)
 }
 
 GRand* 
-g_rand_new ()
+g_rand_new (void)
 {
   guint32 seed = 0;
   GTimeVal now;
-  FILE* dev_random = fopen("/dev/random", "rb");
-
-  if (dev_random)
+  static gboolean dev_random_exists = TRUE;
+  
+  if (dev_random_exists)
     {
-      if (fread (&seed, sizeof (seed), 1, dev_random) != 1)
-       seed = 0;
-      fclose (dev_random);
+      FILE* dev_random = fopen("/dev/random", "rb");
+      if (dev_random)
+       {
+         if (fread (&seed, sizeof (seed), 1, dev_random) != 1)
+           seed = 0;
+         else
+           dev_random_exists = FALSE;
+         fclose (dev_random);
+       }       
+      else
+       dev_random_exists = FALSE;
     }
 
   /* Using /dev/random alone makes the seed computable for the
@@ -96,7 +109,7 @@ g_rand_new ()
 void
 g_rand_free (GRand* rand)
 {
-  g_return_if_fail (rand);
+  g_return_if_fail (rand != NULL);
 
   g_free (rand);
 }
@@ -104,7 +117,7 @@ g_rand_free (GRand* rand)
 void
 g_rand_set_seed (GRand* rand, guint32 seed)
 {
-  g_return_if_fail (rand);
+  g_return_if_fail (rand != NULL);
 
   /* setting initial seeds to mt[N] using         */
   /* the generator Line 25 of Table 1 in          */
@@ -124,7 +137,7 @@ g_rand_int (GRand* rand)
   static const guint32 mag01[2]={0x0, MATRIX_A};
   /* mag01[x] = x * MATRIX_A  for x=0,1 */
 
-  g_return_val_if_fail (rand, 0);
+  g_return_val_if_fail (rand != NULL, 0);
 
   if (rand->mti >= N) { /* generate N words at one time */
     int kk;
@@ -158,7 +171,7 @@ g_rand_int_range (GRand* rand, gint32 min, gint32 max)
   guint32 dist = max - min;
   guint32 random;
 
-  g_return_val_if_fail (rand, min);
+  g_return_val_if_fail (rand != NULL, min);
   g_return_val_if_fail (max > min, min);
 
   if (dist <= 0x10000L) /* 2^16 */
@@ -227,7 +240,7 @@ g_rand_normal (GRand* rand, gdouble mean, gdouble standard_deviation)
      Computer Programming", Vol.2, Second Edition, Page 117: Polar
      method for normal deviates due to Box, Muller, Marsaglia */
   gdouble normal;
-  g_return_val_if_fail (rand, 0);
+  g_return_val_if_fail (rand != NULL, 0);
 
   if (rand->have_next_normal) 
     {
index d3af9eb..cd89f0a 100644 (file)
@@ -29,12 +29,27 @@ const gint length = sizeof (first_numbers) / sizeof (first_numbers[0]);
 
 int main()
 {
-  guint i;
+  guint n;
 
   GRand* rand = g_rand_new_with_seed (first_numbers[0]);
 
-  for (i = 1; i < length; i++)
-    g_assert (first_numbers[i]);
+  for (n = 1; n < length; n++)
+    g_assert (first_numbers[n] == g_rand_int (rand));
+
+  for (n = 1; n < 100000; n++)
+    {
+      gint32 i;
+      gdouble d;
+
+      i = g_rand_int_range (rand, 8,16);
+      g_assert (i >= 8 && i < 16);
+      
+      d = g_rand_double (rand);
+      g_assert (d >= 0 && d < 1);
+
+      d = g_rand_double_range (rand, -8, 32);
+      g_assert (d >= -8 && d < 32);
+    }
 
   g_rand_free (rand);