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                                     []
  
  
  

Reply via email to