diff -r 000000000000 -r e4d67989cc36 genericopenlibs/cstdlib/LSTDLIB/RAND.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cstdlib/LSTDLIB/RAND.CPP Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,118 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// FUNCTION +// <>, <>---pseudo-random numbers +// INDEX +// rand +// INDEX +// srand +// INDEX +// _rand_r +// INDEX +// _srand_r +// ANSI_SYNOPSIS +// + +// #include +// int rand(void); +// void srand(unsigned int <[seed]>); +// int _rand_r(void *<[reent]>); +// void _srand_r(void *<[reent]>, unsigned int <[seed]>); +// TRAD_SYNOPSIS +// #include +// int rand(); +// void srand(<[seed]>) +// unsigned int <[seed]>; +// int _rand_r(<[reent]>); +// char *<[reent]> +// void _srand_r(<[data]>,<[seed]>) +// char *<[reent]>; +// unsigned int <[seed]>; +// <> returns a different integer each time it is called; each +// integer is chosen by an algorithm designed to be unpredictable, so +// that you can use <> when you require a random number. +// The algorithm depends on a static variable called the ``random seed''; +// starting with a given value of the random seed always produces the +// same sequence of numbers in successive calls to <>. +// You can set the random seed using <>; it does nothing beyond +// storing its argument in the static variable used by <>. You can +// exploit this to make the pseudo-random sequence less predictable, if +// you wish, by using some other unpredictable value (often the least +// significant parts of a time-varying value) as the random seed before +// beginning a sequence of calls to <>; or, if you wish to ensure +// (for example, while debugging) that successive runs of your program +// use the same ``random'' numbers, you can use <> to set the same +// random seed at the outset. +// <<_rand_r>> and <<_srand_r>> are reentrant versions of <> and +// <>. The extra argument <[reent]> is a pointer to a reentrancy +// structure. +// RETURNS +// <> returns the next pseudo-random integer in sequence; it is a +// number between <<0>> and <> (inclusive). +// <> does not return a result. +// PORTABILITY +// <> is required by ANSI, but the algorithm for pseudo-random +// number generation is not specified; therefore, even if you use +// the same random seed, you cannot expect the same sequence of results +// on two different systems. +// <> requires no supporting OS subroutines. +// + +#include +#include + +extern "C" { + +/** +Reentrant versions of rand() +@param ptr +*/ +EXPORT_C int _rand_r(struct _reent *ptr) + { + return Math::Rand(*(TInt64*)ptr->_next); + } + +/** +Reentrant versions of srand() +@param ptr +@param seed +*/ +EXPORT_C void _srand_r (struct _reent *ptr, unsigned int seed) + { + ptr->_next[0] = seed; + ptr->_next[1] = seed; + } + +/** +Returns a different integer each time it is called; each +integer is chosen by an algorithm designed to be unpredictable, so +that you can use <> when you require a random number. +@return the next pseudo-random integer in sequence; it is a +number between 0 and RAND_MAX (inclusive). +*/ +EXPORT_C int rand (void) + { + return _rand_r (_REENT); + } + +/** +Sets the random seed. +@param seed seed +*/ +EXPORT_C void srand (unsigned int seed) + { + _srand_r (_REENT, seed); + } + +} // extern "C"