diff options
author | Mikael Djurfeldt <djurfeldt@nada.kth.se> | 1999-01-10 07:57:27 +0000 |
---|---|---|
committer | Mikael Djurfeldt <djurfeldt@nada.kth.se> | 1999-01-10 07:57:27 +0000 |
commit | e7a72986684114de55c73799e99c4fc9897f1cb8 (patch) | |
tree | fee1e4e9f4785dd9bca6c1d6191ce83c169ca9b6 /libguile/random.h | |
parent | 26ade7a21c6a9f061ec1d8e6748bef2bceed70d9 (diff) | |
download | guile-e7a72986684114de55c73799e99c4fc9897f1cb8.tar.gz |
* random.c, random.h: New files: Random number support.
Interface same as slib's.
Diffstat (limited to 'libguile/random.h')
-rw-r--r-- | libguile/random.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/libguile/random.h b/libguile/random.h new file mode 100644 index 000000000..9aa769270 --- /dev/null +++ b/libguile/random.h @@ -0,0 +1,122 @@ +/* classes: h_files */ + +#ifndef RANDOMH +#define RANDOMH +/* Copyright (C) 1999 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + * + * As a special exception, the Free Software Foundation gives permission + * for additional uses of the text contained in its release of GUILE. + * + * The exception is that, if you link the GUILE library with other files + * to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the GUILE library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the + * Free Software Foundation under the name GUILE. If you copy + * code from other Free Software Foundation releases into a copy of + * GUILE, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for GUILE, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. */ + + +#include "libguile/__scm.h" + + +/* + * A plugin interface for RNGs + * + * Using this interface, it is possible for the application to tell + * libguile to use a different RNG. This is desirable if it is + * necessary to use the same RNG everywhere in the application in + * order to prevent interference, if the application uses RNG + * hardware, or if the application has special demands on the RNG. + * + * Look how the default generator is "plugged in" in scm_init_random(). + */ + +typedef struct scm_rstate { + int reserved0; + double reserved1; + /* Custom fields follow here */ +} scm_rstate; + +typedef struct scm_rng { + size_t rstate_size; /* size of random state */ + unsigned long (*random_bits) (scm_rstate *state); /* gives 32 random bits */ + void (*init_rstate) (scm_rstate *state, char *seed, int n); + scm_rstate *(*copy_rstate) (scm_rstate *state); +} scm_rng; + +extern scm_rng scm_the_rng; + + +/* + * Default RNG + */ +typedef struct scm_i_rstate { + scm_rstate rstate; + unsigned long w; + unsigned long c; +} scm_i_rstate; + +extern unsigned long scm_i_uniform32 (scm_i_rstate *); +extern void scm_i_init_rstate (scm_i_rstate *, char *seed, int n); +extern scm_i_rstate *scm_i_copy_rstate (scm_i_rstate *); + + +/* + * Random number library functions + */ +extern double scm_i_uniform01 (scm_rstate *); +extern double scm_i_normal01 (scm_rstate *); +extern double scm_i_exp1 (scm_rstate *); +extern unsigned long scm_i_random (unsigned long m, scm_rstate *); +extern SCM scm_i_random_bignum (SCM m, scm_rstate *); + + +/* + * Scheme level interface + */ +extern long scm_tc16_rstate; +#define SCM_RSTATE(obj) ((scm_rstate *) SCM_CDR (obj)) +#define SCM_RSTATEP(obj) (SCM_TYP16 (obj) == scm_tc16_rstate) + +extern unsigned char scm_masktab[256]; + +extern SCM scm_var_random_state; +extern SCM scm_random (SCM n, SCM state); +extern SCM scm_make_random_state (SCM state); +extern SCM scm_random_uniform (SCM state); +extern SCM scm_random_solid_sphere_x (SCM v, SCM state); +extern SCM scm_random_hollow_sphere_x (SCM v, SCM state); +extern SCM scm_random_normal (SCM state); +extern SCM scm_random_normal_vector_x (SCM v, SCM state); +extern SCM scm_random_exp (SCM state); +extern void scm_init_random (void); + +#endif /* RANDOMH */ |