This is num_rand.c in view mode; [Download] [Up]
/*
Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa
This file is part of GNU Common Lisp, herein referred to as GCL
GCL is free software; you can redistribute it and/or modify it under
the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GCL is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
License for more details.
You should have received a copy of the GNU Library General Public License
along with GCL; see the file COPYING. If not, write to the Free Software
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
Random numbers
*/
#include "include.h"
#include "num_include.h"
#ifdef AOSVS
#endif
object
rando(x, rs)
object x, rs;
{
enum type tx;
object z;
double d;
tx = type_of(x);
if (number_compare(x, small_fixnum(0)) != 1)
FEwrong_type_argument(TSpositive_number, x);
d = (double)(rs->rnd.rnd_value>>1) / (4294967296.0/2.0);
d = number_to_double(x) * d;
if (tx == t_fixnum) {
z = make_fixnum((int)d);
return(z);
} else if (tx == t_bignum) {
z = double_to_integer(d);
return(z);
} else if (tx == t_shortfloat) {
z = alloc_object(t_shortfloat);
sf(z) = (float)d;
return(z);
} else if (tx == t_longfloat) {
z = alloc_object(t_longfloat);
lf(z) = d;
return(z);
} else
FEerror("~S is not an integer nor a floating-point number.",
1, x);
}
object
make_random_state(rs)
object rs;
{
object z;
#ifdef AOSVS
#endif
if (rs == Cnil) {
z = alloc_object(t_random);
z->rnd.rnd_value = symbol_value(Vrandom_state)->rnd.rnd_value;
return(z);
} else if (rs == Ct) {
z = alloc_object(t_random);
#ifdef UNIX
z->rnd.rnd_value = time(0);
#endif
#ifdef AOSVS
#endif
return(z);
} else if (type_of(rs) != t_random)
FEwrong_type_argument(sLrandom_state, rs);
else {
z =alloc_object(t_random);
z->rnd.rnd_value = rs->rnd.rnd_value;
return(z);
}
}
advance_random_state(rs)
object rs;
{
rs->rnd.rnd_value
= rs->rnd.rnd_value
+ (rs->rnd.rnd_value<<2)
+ (rs->rnd.rnd_value<<17)
+ (rs->rnd.rnd_value<<27);
}
Lrandom()
{
int j;
object x;
object rs;
j = vs_top - vs_base;
if (j == 1)
vs_push(symbol_value(Vrandom_state));
check_arg(2);
check_type_random_state(&vs_base[1]);
advance_random_state(vs_base[1]);
x = rando(vs_base[0], vs_base[1]);
vs_top = vs_base;
vs_push(x);
}
Lmake_random_state()
{
int j;
object x;
j = vs_top - vs_base;
if (j == 0)
vs_push(Cnil);
check_arg(1);
x = make_random_state(vs_head);
vs_top = vs_base;
vs_push(x);
}
Lrandom_state_p()
{
check_arg(1);
if (type_of(vs_pop) == t_random)
vs_push(Ct);
else
vs_push(Cnil);
}
init_num_rand()
{
Vrandom_state = make_special("*RANDOM-STATE*",
make_random_state(Ct));
make_function("RANDOM", Lrandom);
make_function("MAKE-RANDOM-STATE", Lmake_random_state);
make_function("RANDOM-STATE-P", Lrandom_state_p);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.