Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10 beta 3/9/83; site callan.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!godot!harvard!seismo!umcp-cs!gymble!lll-crg!dual!callan!tim From: tim@callan.UUCP (Tim Smith) Newsgroups: net.bugs,net.unix,net.lang.c,net.math Subject: Re: Bug in rand() and srand() Message-ID: <307@callan.UUCP> Date: Mon, 4-Mar-85 20:31:30 EST Article-I.D.: callan.307 Posted: Mon Mar 4 20:31:30 1985 Date-Received: Sat, 9-Mar-85 07:26:12 EST References: <320@cubsvax.UUCP> Reply-To: tim@callan.UUCP (Tim Smith) Organization: Callan Data Systems, Westlake Village, CA Lines: 30 Xref: watmath net.bugs:564 net.unix:3857 net.lang.c:4674 net.math:1883 Summary: In article <320@cubsvax.UUCP> peters@cubsvax.UUCP (Peter S. Shenkin) writes: >In attempting to use these functions under 4.1bsd on a VAX/780, I found that >rand() returns strictly alternating even and odd numbers, regardless of >seed!!! So I went and tried the same thing on a 4.2bsd system, and found >the same behavior. > If BSD rand() is at all like System V rand(), this is not a bug. Rand() is a multiplicitive congruential (sp?) random number generator, which means it works like this: R = A * R + C mod M i+1 i So, depending on the parity of A and C, you have one of the following cases: Ri+1 is always odd Ri+1 is always even Ri+1 is always same parity as Ri or Ri+1 is always opposite parity of Ri In this sort of number generator, the high bits are "more random" than the low bits. Thus, for example, to get a stream or random bits, one would look at the top bit ( assuming M is a power of two... ), not the bottom bit. Look at Knuth, Vol. II for almost all that is known on this topic. -- Duty Now for the Future Tim Smith ihnp4!wlbr!callan!tim or ihnp4!cithep!tim