/* * * Rand.c * * - linear and additive congruential random number generators * (see R. Sedgewick, Algorithms, Chapter 35) * * Implementation: R. Fuchs, EMBL Data Library, 1991 * */ #define m1 10000 #define m 100000000 /* linear congruential method * * linrand() returns an unsigned long random number in the range 0 to r-1 */ static unsigned long mult(unsigned long p, unsigned long q) { unsigned long p1,p0,q1,q0; p1 = p/m1; p0 = p % m1; q1 = q/m1; q0 = q % m1; return (unsigned long)((((p0*q1 + p1*q0) % m1) * m1 + p0*q0) % m); } /* additive congruential method * * addrand() returns an unsigned long random number in the range 0 to r-1 * The random number generator is initialized by addrandinit() */ static unsigned long j; static unsigned long a[55]; unsigned long addrand(unsigned long r) { int x,y; /* fprintf(stdout,"\n j = %d",j); */ j = (j + 1) % 55; /* fprintf(stdout,"\n j = %d",j); */ x = (j+23)%55; y = (j+54)%55; a[j] = (a[x] + a[y]) % m; /* a[j] = (a[(j+23)%55] + a[(j+54)%55]) % m; */ /* fprintf(stdout,"\n a[j] = %d",a[j]); */ return( ((a[j] / m1) * r) / m1 ); } void addrandinit(unsigned long s) { a[0] = s; j = 0; do { ++j; a[j] = (mult(31,a[j-1]) + 1) % m; } while (j<54); } /******************************COPYRIGHT NOTICE*******************************/ /*© Centro de Regulacio Genomica */ /*and */ /*Cedric Notredame */ /*Fri Feb 18 08:27:45 CET 2011 - Revision 596. */ /*All rights reserved.*/ /*This file is part of T-COFFEE.*/ /**/ /* T-COFFEE is free software; you can redistribute it and/or modify*/ /* it under the terms of the GNU General Public License as published by*/ /* the Free Software Foundation; either version 2 of the License, or*/ /* (at your option) any later version.*/ /**/ /* T-COFFEE 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 General Public License for more details.*/ /**/ /* You should have received a copy of the GNU General Public License*/ /* along with Foobar; if not, write to the Free Software*/ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ /*............................................... |*/ /* If you need some more information*/ /* cedric.notredame@europe.com*/ /*............................................... |*/ /**/ /**/ /* */ /******************************COPYRIGHT NOTICE*******************************/