You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
#include <config.h>
+#include <gsl/gsl_rng.h>
#include <limits.h>
#include <stdio.h>
#include <math.h>
#include "command.h"
#include "error.h"
#include "lexer.h"
-#include "random.h"
+#include "settings.h"
#include "str.h"
#include "var.h"
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
#include "debug-print.h"
/* The two different types of samples. */
int a, b;
unsigned frac;
- lex_match_id ("SAMPLE");
-
if (!lex_force_num ())
return CMD_FAILURE;
- if (!lex_integer_p ())
+ if (!lex_is_integer ())
{
+ unsigned long min = gsl_rng_min (get_rng ());
+ unsigned long max = gsl_rng_max (get_rng ());
+
type = TYPE_FRACTION;
if (tokval <= 0 || tokval >= 1)
{
return CMD_FAILURE;
}
- frac = tokval * UINT_MAX;
+ frac = tokval * (max - min) + min;
a = b = 0;
}
else
}
lex_get ();
-#if DEBUGGING
- if (type == TYPE_FRACTION)
- printf ("SAMPLE %g.\n", frac / (double) UINT_MAX);
- else
- printf ("SAMPLE %d FROM %d.\n", a, b);
-#endif
-
trns = xmalloc (sizeof *trns);
trns->h.proc = sample_trns_proc;
trns->h.free = NULL;
return lex_end_of_command ();
}
+/* Executes a SAMPLE transformation. */
static int
sample_trns_proc (struct trns_header * trns, struct ccase *c UNUSED,
int case_num UNUSED)
if (t->type == TYPE_FRACTION)
{
- if (rng_get_unsigned (pspp_rng ()) <= t->frac)
+ if (gsl_rng_get (get_rng ()) <= t->frac)
return -1;
else
return -2;
if (t->m >= t->n)
return -2;
- U = rng_get_double (pspp_rng ());
+ U = gsl_rng_uniform (get_rng ());
if ((t->N - t->t) * U >= t->n - t->m)
{
t->t++;