cvsuser 04/05/12 12:30:34
Modified: ops experimental.ops
. MANIFEST
Added: t/op random.t
Log:
A simple implementation of rand() and srand() which may not be ideal for
Perl. Also included is the test file for random ops. If anyone can think
of a good way to ALWAYS know that a number we got back was "random",
throw that into the test ;-)
Courtesy of Aaron Sherman <[EMAIL PROTECTED]>
Revision Changes Path
1.1 parrot/t/op/random.t
Index: random.t
===================================================================
#! perl -w
# Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
# $Id: random.t,v 1.1 2004/05/12 19:30:28 jrieks Exp $
=head1 NAME
t/op/random.t - Random numbers
=head1 SYNOPSIS
% perl t/op/random.t
=head1 DESCRIPTION
Tests random number generation
=cut
use Parrot::Test tests => 5;
use Test::More;
use Parrot::Config;
use Config;
output_is(<<'CODE', <<OUT, "generate random int");
rand I0
print "Called random just fine\n"
end
CODE
Called random just fine
OUT
output_is(<<'CODE', <<OUT, "generate random 10>int>=0");
rand I0, 10
ge I0, 10, BROKE
lt I0, 0, BROKE
print "Called random just fine\n"
exit 0
BROKE:
print "Failure: random number "
print I0
print " is not in range 0..9\n"
end
CODE
Called random just fine
OUT
output_is(<<'CODE', <<OUT, "generate random num");
rand N0
print "Called random just fine\n"
end
CODE
Called random just fine
OUT
output_is(<<'CODE', <<OUT, "generate random 10>num>=0");
rand N0, 10.0
ge N0, 10.0, BROKE
lt N0, 0, BROKE
print "Called random just fine\n"
exit 0
BROKE:
print "Failure: random number "
print N0
print " is not in range 0.0..<10.0\n"
end
CODE
Called random just fine
OUT
output_is(<<'CODE', <<OUT, "Seed RNG");
srand 1
print "Seeded the rng just fine\n"
end
CODE
Seeded the rng just fine
OUT
1; # HONK
1.2 +66 -0 parrot/ops/experimental.ops
Index: experimental.ops
===================================================================
RCS file: /cvs/public/parrot/ops/experimental.ops,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -r1.1 -r1.2
--- experimental.ops 12 May 2004 09:57:03 -0000 1.1
+++ experimental.ops 12 May 2004 19:30:31 -0000 1.2
@@ -124,6 +124,72 @@
###############################################################################
+=head2 random number operations
+
+Implementations of various random number operations
+
+=over 4
+
+=cut
+
+########################################
+
+=item B<rand>(out NUM, in NUM)
+
+=item B<rand>(out NUM)
+
+=item B<rand>(out INT, in INT)
+
+=item B<rand>(out INT)
+
+=item B<srand>(in NUM)
+
+Generate random numbers based on the Random PMC.
+
+=cut
+
+inline op rand(out NUM, in NUM) {
+ FLOATVAL n = $2;
+ PMC * r = pmc_new_noinit(interpreter, enum_class_Random);
+ $1 = VTABLE_get_number(interpreter,r);
+ $1 *= $2;
+ goto NEXT();
+}
+
+inline op rand(out INT, in INT) {
+ INTVAL n = $2;
+ PMC * r = pmc_new_noinit(interpreter, enum_class_Random);
+ FLOATVAL resultnum;
+ resultnum = VTABLE_get_number(interpreter,r);
+ $1 = (INTVAL)(resultnum * (FLOATVAL)n);
+ goto NEXT();
+}
+
+inline op rand(out NUM) {
+ PMC * r = pmc_new_noinit(interpreter, enum_class_Random);
+ $1 = VTABLE_get_number(interpreter,r);
+ goto NEXT();
+}
+
+inline op rand(out INT) {
+ PMC *r = pmc_new_noinit(interpreter, enum_class_Random);
+ $1 = VTABLE_get_integer(interpreter,r);
+ goto NEXT();
+}
+
+inline op srand(in INT) {
+ INTVAL i = $1;
+ PMC * r = pmc_new_noinit(interpreter, enum_class_Random);
+ VTABLE_set_integer_native(interpreter,r,i);
+ goto NEXT();
+}
+
+=back
+
+=cut
+
+###############################################################################
+
=head1 COPYRIGHT
Copyright (C) 2001-2004 The Perl Foundation. All rights reserved.
1.648 +1 -0 parrot/MANIFEST
Index: MANIFEST
===================================================================
RCS file: /cvs/public/parrot/MANIFEST,v
retrieving revision 1.647
retrieving revision 1.648
diff -u -w -r1.647 -r1.648
--- MANIFEST 12 May 2004 09:57:08 -0000 1.647
+++ MANIFEST 12 May 2004 19:30:34 -0000 1.648
@@ -2643,6 +2643,7 @@
t/op/lexicals.t []
t/op/macro.t []
t/op/number.t []
+t/op/random.t []
t/op/rx.t []
t/op/stacks.t []
t/op/string.t []