X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fsample.c;h=96c5f4d9070705fadd7cebb297753aaec9ebd91b;hb=8bc8a011fa9df5b9f5aa00144c8d3478fd7b93fa;hp=84f2e8992f65340a5062be3afc7f7afe682dffcb;hpb=4944c86a9318bc5b5578ab145a95c116ffd2c9fd;p=pspp-builds.git diff --git a/src/sample.c b/src/sample.c index 84f2e899..96c5f4d9 100644 --- a/src/sample.c +++ b/src/sample.c @@ -18,18 +18,18 @@ 02111-1307, USA. */ #include +#include +#include #include #include #include "alloc.h" #include "command.h" #include "error.h" #include "lexer.h" -#include "random.h" +#include "settings.h" #include "str.h" #include "var.h" -#undef DEBUGGING -/*#define DEBUGGING 1 */ #include "debug-print.h" /* The two different types of samples. */ @@ -45,11 +45,11 @@ struct sample_trns struct trns_header h; int type; /* One of TYPE_*. */ int n, N; /* TYPE_A_FROM_B: n from N. */ - int m, t; /* TYPE_A_FROM_B: # selected so far; # so far. */ - int frac; /* TYPE_FRACTION: a fraction out of 65536. */ + int m, t; /* TYPE_A_FROM_B: # picked so far; # so far. */ + unsigned frac; /* TYPE_FRACTION: a fraction of UINT_MAX. */ }; -int sample_trns_proc (struct trns_header *, struct ccase *); +static trns_proc_func sample_trns_proc; int cmd_sample (void) @@ -58,14 +58,15 @@ cmd_sample (void) int type; int a, b; - int frac; - - lex_match_id ("SAMPLE"); + unsigned frac; if (!lex_force_num ()) return CMD_FAILURE; if (!lex_integer_p ()) { + unsigned long min = gsl_rng_min (get_rng ()); + unsigned long max = gsl_rng_max (get_rng ()); + type = TYPE_FRACTION; if (tokval <= 0 || tokval >= 1) { @@ -74,7 +75,7 @@ cmd_sample (void) return CMD_FAILURE; } - frac = tokval * 65536; + frac = tokval * (max - min) + min; a = b = 0; } else @@ -99,13 +100,6 @@ cmd_sample (void) } lex_get (); -#if DEBUGGING - if (type == TYPE_FRACTION) - printf ("SAMPLE %g.\n", frac / 65536.); - else - printf ("SAMPLE %d FROM %d.\n", a, b); -#endif - trns = xmalloc (sizeof *trns); trns->h.proc = sample_trns_proc; trns->h.free = NULL; @@ -119,19 +113,26 @@ cmd_sample (void) return lex_end_of_command (); } -int -sample_trns_proc (struct trns_header * trns, struct ccase *c unused) +/* Executes a SAMPLE transformation. */ +static int +sample_trns_proc (struct trns_header * trns, struct ccase *c UNUSED, + int case_num UNUSED) { struct sample_trns *t = (struct sample_trns *) trns; double U; - if (t->type == TYPE_FRACTION) - return (rand_simple (0x10000) <= t->frac) - 2; + if (t->type == TYPE_FRACTION) + { + if (gsl_rng_get (get_rng ()) <= t->frac) + return -1; + else + return -2; + } if (t->m >= t->n) return -2; - U = rand_uniform (1); + U = gsl_rng_uniform (get_rng ()); if ((t->N - t->t) * U >= t->n - t->m) { t->t++;