rand.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       rand.c (3130B)
       ---
            1 /*-
            2  * Copyright (c) 1990, 1993
            3  *        The Regents of the University of California.  All rights reserved.
            4  *
            5  * Redistribution and use in source and binary forms, with or without
            6  * modification, are permitted provided that the following conditions
            7  * are met:
            8  * 1. Redistributions of source code must retain the above copyright
            9  *    notice, this list of conditions and the following disclaimer.
           10  * 2. Redistributions in binary form must reproduce the above copyright
           11  *    notice, this list of conditions and the following disclaimer in the
           12  *    documentation and/or other materials provided with the distribution.
           13  * 3. All advertising materials mentioning features or use of this software
           14  *    must display the following acknowledgement:
           15  *        This product includes software developed by the University of
           16  *        California, Berkeley and its contributors.
           17  * 4. Neither the name of the University nor the names of its contributors
           18  *    may be used to endorse or promote products derived from this software
           19  *    without specific prior written permission.
           20  *
           21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
           22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
           23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
           24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
           25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
           26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
           27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
           28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
           29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
           30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
           31  * SUCH DAMAGE.
           32  *
           33  * Posix rand_r function added May 1999 by Wes Peters <wes@softweyr.com>.
           34  */
           35 
           36 #include <sys/types.h>
           37 #include <stdlib.h>
           38 
           39 typedef unsigned long u_long;
           40 typedef unsigned int u_int;
           41 
           42 static int
           43 do_rand(unsigned long *ctx)
           44 {
           45 #ifdef  USE_WEAK_SEEDING
           46 /*
           47  * Historic implementation compatibility.
           48  * The random sequences do not vary much with the seed,
           49  * even with overflowing.
           50  */
           51         return ((*ctx = *ctx * 1103515245 + 12345) % ((u_long)RAND_MAX + 1));
           52 #else   /* !USE_WEAK_SEEDING */
           53 /*
           54  * Compute x = (7^5 * x) mod (2^31 - 1)
           55  * wihout overflowing 31 bits:
           56  *      (2^31 - 1) = 127773 * (7^5) + 2836
           57  * From "Random number generators: good ones are hard to find",
           58  * Park and Miller, Communications of the ACM, vol. 31, no. 10,
           59  * October 1988, p. 1195.
           60  */
           61         long hi, lo, x;
           62 
           63         /* Can't be initialized with 0, so use another value. */
           64         if (*ctx == 0)
           65                 *ctx = 123459876;
           66         hi = *ctx / 127773;
           67         lo = *ctx % 127773;
           68         x = 16807 * lo - 2836 * hi;
           69         if (x < 0)
           70                 x += 0x7fffffff;
           71         return ((*ctx = x) % ((u_long)RAND_MAX + 1));
           72 #endif  /* !USE_WEAK_SEEDING */
           73 }
           74 
           75 
           76 int
           77 rand_r(unsigned int *ctx)
           78 {
           79         u_long val = (u_long) *ctx;
           80         int r = do_rand(&val);
           81 
           82         *ctx = (unsigned int) val;
           83         return (r);
           84 }
           85 
           86 static u_long next = 1;
           87 
           88 int
           89 rand()
           90 {
           91         return (do_rand(&next));
           92 }
           93 
           94 void
           95 srand(seed)
           96 u_int seed;
           97 {
           98         next = seed;
           99 }
          100