From: Sebastian Wilhelmi Date: Mon, 12 Apr 1999 12:53:37 +0000 (+0000) Subject: Moved struct declaration up. Style fixes. X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=3aa65d30eb2dfeb63956a38ec9c5296477712888;p=dana%2Fcg-glib.git Moved struct declaration up. Style fixes. 1999-04-12 Sebastian Wilhelmi * 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. --- diff --git a/ChangeLog b/ChangeLog index 90d5314d..0f462977 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +1999-04-12 Sebastian Wilhelmi + + * 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 * grand.c, tests/rand-test.c: New files to implement the Mersenne diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 90d5314d..0f462977 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,11 @@ +1999-04-12 Sebastian Wilhelmi + + * 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 * grand.c, tests/rand-test.c: New files to implement the Mersenne diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 90d5314d..0f462977 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,11 @@ +1999-04-12 Sebastian Wilhelmi + + * 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 * grand.c, tests/rand-test.c: New files to implement the Mersenne diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 90d5314d..0f462977 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,11 @@ +1999-04-12 Sebastian Wilhelmi + + * 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 * grand.c, tests/rand-test.c: New files to implement the Mersenne diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 90d5314d..0f462977 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,11 @@ +1999-04-12 Sebastian Wilhelmi + + * 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 * grand.c, tests/rand-test.c: New files to implement the Mersenne diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 90d5314d..0f462977 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,11 @@ +1999-04-12 Sebastian Wilhelmi + + * 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 * grand.c, tests/rand-test.c: New files to implement the Mersenne diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 90d5314d..0f462977 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,11 @@ +1999-04-12 Sebastian Wilhelmi + + * 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 * grand.c, tests/rand-test.c: New files to implement the Mersenne diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 90d5314d..0f462977 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,11 @@ +1999-04-12 Sebastian Wilhelmi + + * 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 * grand.c, tests/rand-test.c: New files to implement the Mersenne diff --git a/glib.h b/glib.h index a772fb53..bfd1f49b 100644 --- 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 diff --git a/glib/glib.h b/glib/glib.h index a772fb53..bfd1f49b 100644 --- a/glib/glib.h +++ b/glib/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 diff --git a/glib/grand.c b/glib/grand.c index 2725d9fe..65f2af22 100644 --- a/glib/grand.c +++ b/glib/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 . */ /* @@ -31,6 +32,10 @@ * GLib at ftp://ftp.gtk.org/pub/gtk/. */ +/* + * MT safe + */ + #include #include #include @@ -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 2725d9fe..65f2af22 100644 --- 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 . */ /* @@ -31,6 +32,10 @@ * GLib at ftp://ftp.gtk.org/pub/gtk/. */ +/* + * MT safe + */ + #include #include #include @@ -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/tests/rand-test.c b/tests/rand-test.c index d3af9eb2..cd89f0a4 100644 --- a/tests/rand-test.c +++ b/tests/rand-test.c @@ -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);