mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-24 14:36:13 +01:00
Moved struct declaration up. Style fixes.
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.
This commit is contained in:
parent
cb33239290
commit
3aa65d30eb
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
8
glib.h
8
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
|
||||
|
@ -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
|
||||
|
27
glib/grand.c
27
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 <wilhelmi@ira.uka.de>.
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -31,6 +32,10 @@
|
||||
* GLib at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
/*
|
||||
* MT safe
|
||||
*/
|
||||
|
||||
#include <glib.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
@ -70,18 +75,26 @@ 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");
|
||||
static gboolean dev_random_exists = TRUE;
|
||||
|
||||
if (dev_random_exists)
|
||||
{
|
||||
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
|
||||
outside. This might pose security problems somewhere. This should
|
||||
@ -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)
|
||||
{
|
||||
|
27
grand.c
27
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>.
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -31,6 +32,10 @@
|
||||
* GLib at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
/*
|
||||
* MT safe
|
||||
*/
|
||||
|
||||
#include <glib.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
@ -70,18 +75,26 @@ 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");
|
||||
static gboolean dev_random_exists = TRUE;
|
||||
|
||||
if (dev_random_exists)
|
||||
{
|
||||
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
|
||||
outside. This might pose security problems somewhere. This should
|
||||
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user