home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / sci / crypt / 7175 < prev    next >
Encoding:
Internet Message Format  |  1993-01-28  |  2.0 KB

  1. Path: sparky!uunet!ulowell!m2c!nic.umass.edu!noc.near.net!transfer.stratus.com!ellisun.sw.stratus.com!cme
  2. From: cme@ellisun.sw.stratus.com (Carl Ellison)
  3. Newsgroups: sci.crypt
  4. Subject: Re: Wanted: very fast random number generator
  5. Message-ID: <1k6n9tINNsik@transfer.stratus.com>
  6. Date: 27 Jan 93 19:20:29 GMT
  7. References: <C1H7tG.7At.2@cs.cmu.edu>
  8. Organization: Stratus Computer, Software Engineering
  9. Lines: 55
  10. NNTP-Posting-Host: ellisun.sw.stratus.com
  11.  
  12. In article <C1H7tG.7At.2@cs.cmu.edu> tgl+@cs.cmu.edu (Tom Lane) writes:
  13. >What I need is a very very fast random number generator; it does NOT need to
  14. >be cryptographically strong.
  15.  
  16.  
  17. My favorite fast generator:
  18.  
  19. #define N_RANS  (65)
  20. #define PRIMERADIX (1073741789)
  21.  
  22. long int  ran_arr[ N_RANS ] ;
  23. int  ran_rdr = 0 ;
  24.  
  25.  
  26. /* --------------------------------------------------------------------- */
  27. /* raw_ran -- compute the next raw random number.             */
  28. /*    This routine uses only addition.                 */
  29. /* --------------------------------------------------------------------- */
  30.  
  31. long int raw_ran()
  32. {
  33.     int  nrdr ;
  34.     long int  v ;
  35.  
  36.     nrdr = ran_rdr + 1 ;
  37.     if ( N_RANS <= nrdr ) nrdr = 0 ;
  38.     v = ran_arr[ ran_rdr ] + ran_arr[ nrdr ] ;
  39.     if ( v >= PRIMERADIX ) v -= PRIMERADIX ;    /* poor man's MOD function */
  40.     ran_arr[ ran_rdr ] = v ;
  41.     ran_rdr = nrdr ;
  42.     return ( v ) ;
  43. }   /* end of raw_ran */
  44.  
  45. /* --------------------------------------------------------------------- */
  46. /* ran_radix --- return a random integer, radix r.             */
  47. /* --------------------------------------------------------------------- */
  48.  
  49. long int ran_radix( r )
  50. long int r ;
  51. {
  52.     return ( raw_ran() % r ) ;
  53. }   /* end of ran_radix */
  54.  
  55.  
  56. You should fill the ran_arr with true random numbers, but I sometimes
  57. use a typed string and then ask for (N_RANS)**2 raw_ran() values
  58. before using a real one.
  59.  
  60. --Carl
  61.  
  62. -- 
  63. -- <<Disclaimer: All opinions expressed are my own, of course.>>
  64. -- Carl Ellison                        cme@sw.stratus.com
  65. -- Stratus Computer Inc.    M3-2-BKW        TEL: (508)460-2783
  66. -- 55 Fairbanks Boulevard ; Marlborough MA 01752-1298    FAX: (508)624-7488
  67.