summaryrefslogtreecommitdiff
path: root/ext/standard/lcg.c
diff options
context:
space:
mode:
authorStig Bakken <ssb@php.net>1999-08-29 20:12:12 +0000
committerStig Bakken <ssb@php.net>1999-08-29 20:12:12 +0000
commit5600f889b2cb8d2b11b54d711273c40916c4b4fa (patch)
tree2e09d483a5e5d9ac5acb4bd602fbb3a19206e9eb /ext/standard/lcg.c
parent869eeb62f42ce1c1d8e17efaa70676988cbabdc8 (diff)
downloadphp-git-5600f889b2cb8d2b11b54d711273c40916c4b4fa.tar.gz
moved lcg stuff to ext/standard
Diffstat (limited to 'ext/standard/lcg.c')
-rw-r--r--ext/standard/lcg.c98
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
+};