Remove descript.c from .cvsignore.
[pspp-builds.git] / src / sample.c
index 84f2e8992f65340a5062be3afc7f7afe682dffcb..67523b3d80ff62e65cd5185de4ce70ce26df7777 100644 (file)
@@ -18,6 +18,7 @@
    02111-1307, USA. */
 
 #include <config.h>
+#include <limits.h>
 #include <stdio.h>
 #include <math.h>
 #include "alloc.h"
@@ -28,8 +29,6 @@
 #include "str.h"
 #include "var.h"
 
-#undef DEBUGGING
-/*#define DEBUGGING 1 */
 #include "debug-print.h"
 
 /* The two different types of samples. */
@@ -45,11 +44,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,9 +57,7 @@ cmd_sample (void)
 
   int type;
   int a, b;
-  int frac;
-
-  lex_match_id ("SAMPLE");
+  unsigned frac;
 
   if (!lex_force_num ())
     return CMD_FAILURE;
@@ -74,7 +71,7 @@ cmd_sample (void)
          return CMD_FAILURE;
        }
          
-      frac = tokval * 65536;
+      frac = tokval * UINT_MAX;
       a = b = 0;
     }
   else
@@ -101,7 +98,7 @@ cmd_sample (void)
 
 #if DEBUGGING
   if (type == TYPE_FRACTION)
-    printf ("SAMPLE %g.\n", frac / 65536.);
+    printf ("SAMPLE %g.\n", frac / (double) UINT_MAX);
   else
     printf ("SAMPLE %d FROM %d.\n", a, b);
 #endif
@@ -119,19 +116,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 (rng_get_unsigned (pspp_rng ()) <= t->frac)
+        return -1;
+      else
+        return -2;
+    }
 
   if (t->m >= t->n)
     return -2;
 
-  U = rand_uniform (1);
+  U = rng_get_double (pspp_rng ());
   if ((t->N - t->t) * U >= t->n - t->m)
     {
       t->t++;