| |
| /* |
| ** misc.c |
| ** BYTEmark (tm) |
| ** BYTE's Native Mode Benchmarks |
| ** Rick Grehan, BYTE Magazine |
| ** DISCLAIMER |
| ** The source, executable, and documentation files that comprise |
| ** the BYTEmark benchmarks are made available on an "as is" basis. |
| ** This means that we at BYTE Magazine have made every reasonable |
| ** effort to verify that the there are no errors in the source and |
| ** executable code. We cannot, however, guarantee that the programs |
| ** are error-free. Consequently, McGraw-HIll and BYTE Magazine make |
| ** no claims in regard to the fitness of the source code, executable |
| ** code, and documentation of the BYTEmark. |
| ** Furthermore, BYTE Magazine, McGraw-Hill, and all employees |
| ** of McGraw-Hill cannot be held responsible for any damages resulting |
| ** from the use of this code or the results obtained from using |
| ** this code. |
| */ |
| |
| #include <stdio.h> |
| #include "misc.h" |
| |
| /*********************************************************** |
| ** MISCELLANEOUS BUT OTHERWISE NECESSARY ROUTINES ** |
| ***********************************************************/ |
| |
| /**************************** |
| ** RANDOM NUMBER GENERATOR ** |
| ***************************** |
| ** This is a second-order linear congruential random number |
| ** generator. Its advantage is (of course) that it can be |
| ** seeded and will thus produce repeatable sequences of |
| ** random numbers. |
| */ |
| |
| /**************************** |
| * randwc() * |
| ***************************** |
| ** Returns signed long random modulo num. |
| */ |
| /* |
| long randwc(long num) |
| { |
| return(randnum(0L)%num); |
| } |
| */ |
| /* |
| ** Returns signed 32-bit random modulo num. |
| */ |
| int32 randwc(int32 num) |
| { |
| return(randnum((int32)0)%num); |
| } |
| |
| /*************************** |
| ** abs_randwc() ** |
| **************************** |
| ** Same as randwc(), only this routine returns only |
| ** positive numbers. |
| */ |
| /* |
| unsigned long abs_randwc(unsigned long num) |
| { |
| long temp; |
| |
| temp=randwc(num); |
| if(temp<0) temp=0L-temp; |
| |
| return((unsigned long)temp); |
| } |
| */ |
| u32 abs_randwc(u32 num) |
| { |
| int32 temp; /* Temporary storage */ |
| |
| temp=randwc(num); |
| if(temp<0) temp=(int32)0-temp; |
| |
| return((u32)temp); |
| } |
| |
| /**************************** |
| * randnum() * |
| ***************************** |
| ** Second order linear congruential generator. |
| ** Constants suggested by J. G. Skellam. |
| ** If val==0, returns next member of sequence. |
| ** val!=0, restart generator. |
| */ |
| /* |
| long randnum(long lngval) |
| { |
| register long interm; |
| static long randw[2] = { 13L , 117L }; |
| |
| if (lngval!=0L) |
| { randw[0]=13L; randw[1]=117L; } |
| |
| interm=(randw[0]*254754L+randw[1]*529562L)%999563L; |
| randw[1]=randw[0]; |
| randw[0]=interm; |
| return(interm); |
| } |
| */ |
| int32 randnum(int32 lngval) |
| { |
| register int32 interm; |
| static int32 randw[2] = { (int32)13 , (int32)117 }; |
| |
| if (lngval!=(int32)0) |
| { randw[0]=(int32)13; randw[1]=(int32)117; } |
| |
| interm=(randw[0]*(int32)254754+randw[1]*(int32)529562)%(int32)999563; |
| randw[1]=randw[0]; |
| randw[0]=interm; |
| return(interm); |
| } |
| |