Changeset 3614


Ignore:
Timestamp:
09/08/03 12:38:05 (20 years ago)
Author:
piso
Message:

RANDOM: limit must be positive integer or positive float.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/lisp/Primitives.java

    r3612 r3614  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: Primitives.java,v 1.374 2003-09-08 02:35:47 piso Exp $
     5 * $Id: Primitives.java,v 1.375 2003-09-08 12:38:05 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    41934193            if (args[0] instanceof Fixnum) {
    41944194                int limit = ((Fixnum)args[0]).getValue();
    4195                 int n = random.nextInt((int)limit);
    4196                 Debug.assertTrue(n < limit);
    4197                 return new Fixnum(n);
    4198             }
    4199             if (args[0] instanceof Bignum) {
     4195                if (limit > 0) {
     4196                    int n = random.nextInt((int)limit);
     4197                    return new Fixnum(n);
     4198                }
     4199            } else if (args[0] instanceof Bignum) {
    42004200                BigInteger limit = ((Bignum)args[0]).getValue();
    4201                 int bitLength = limit.bitLength();
    4202                 BigInteger rand = new BigInteger(bitLength + 1, random);
    4203                 BigInteger remainder = rand.remainder(limit);
    4204                 return number(remainder);
    4205             }
    4206             if (args[0] instanceof LispFloat) {
     4201                if (limit.signum() > 0) {
     4202                    int bitLength = limit.bitLength();
     4203                    BigInteger rand = new BigInteger(bitLength + 1, random);
     4204                    BigInteger remainder = rand.remainder(limit);
     4205                    return number(remainder);
     4206                }
     4207            } else if (args[0] instanceof LispFloat) {
    42074208                double limit = ((LispFloat)args[0]).getValue();
    4208                 double rand = random.nextDouble();
    4209                 return new LispFloat(rand * limit);
    4210             }
    4211             throw new TypeError(args[0], "number");
     4209                if (limit > 0) {
     4210                    double rand = random.nextDouble();
     4211                    return new LispFloat(rand * limit);
     4212                }
     4213            }
     4214            throw new TypeError(args[0], "positive integer or positive float");
    42124215        }
    42134216    };
Note: See TracChangeset for help on using the changeset viewer.