diff options
author | Stig Bakken <ssb@php.net> | 1999-08-29 20:12:12 +0000 |
---|---|---|
committer | Stig Bakken <ssb@php.net> | 1999-08-29 20:12:12 +0000 |
commit | 5600f889b2cb8d2b11b54d711273c40916c4b4fa (patch) | |
tree | 2e09d483a5e5d9ac5acb4bd602fbb3a19206e9eb /ext/standard/lcg.c | |
parent | 869eeb62f42ce1c1d8e17efaa70676988cbabdc8 (diff) | |
download | php-git-5600f889b2cb8d2b11b54d711273c40916c4b4fa.tar.gz |
moved lcg stuff to ext/standard
Diffstat (limited to 'ext/standard/lcg.c')
-rw-r--r-- | ext/standard/lcg.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/ext/standard/lcg.c b/ext/standard/lcg.c new file mode 100644 index 0000000000..8fe4950aa0 --- /dev/null +++ b/ext/standard/lcg.c @@ -0,0 +1,98 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Sascha Schumann <ss@2ns.de> | + +----------------------------------------------------------------------+ + */ + +#include "php.h" +#include "php_lcg.h" + +#if HAVE_UNISTD_H +#include <unistd.h> +#endif + +#ifdef ZTS +int lcg_globals_id; +#else +static php_lcg_globals lcg_globals; +#endif + +/* + * combinedLCG() returns a pseudo random number in the range of (0,1). + * The function combines two CGs with periods of + * 2^31 - 85 and 2^31 - 249. The period of this function + * is equal to the product of both primes. + */ + +#define MODMULT(a,b,c,m,s) q = s/a;s=b*(s-a*q)-c*q;if(s<0)s+=m + +double php_combined_lcg(void) +{ + long q; + long z; + LCGLS_FETCH(); + + MODMULT(53668,40014,12211,2147483563L, LCG(s1)); + MODMULT(52774,40692,3791, 2147483399L, LCG(s2)); + + z = LCG(s1) - LCG(s2); + if(z < 1) { + z += 2147483562; + } + + return z * 4.656613e-10; +} + +static void init_globals(LCGLS_D) +{ + LCG(s1) = 1; +#ifdef ZTS + LCG(s2) = (long) tsrm_thread_id(); +#else + LCG(s2) = (long) getpid(); +#endif +} + +static int php_minit_lcg(INIT_FUNC_ARGS) +{ +#ifdef ZTS + lcg_globals_id = ts_allocate_id(sizeof(php_lcg_globals), init_globals, NULL); +#else + init_globals(); +#endif + return SUCCESS; +} + +/* {{{ proto double lcg_value() + returns a value from the combined linear congruential generator */ +PHP_FUNCTION(lcg_value) +{ + RETURN_DOUBLE(php_combined_lcg()); +} +/* }}} */ + +static function_entry lcg_functions[] = { + PHP_FE(lcg_value, NULL) + {0} +}; + +zend_module_entry lcg_module_entry = { + "LCG", + lcg_functions, + php_minit_lcg, NULL, + NULL, NULL, + NULL, + STANDARD_MODULE_PROPERTIES +}; |