From owner-freebsd-stable@FreeBSD.ORG Mon Apr 7 22:32:40 2003 Return-Path: Delivered-To: freebsd-stable@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 2FD3937B401 for ; Mon, 7 Apr 2003 22:32:40 -0700 (PDT) Received: from smtpproxy1.mitre.org (smtpproxy1.mitre.org [192.160.51.75]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7134C43FD7 for ; Mon, 7 Apr 2003 22:32:35 -0700 (PDT) (envelope-from jandrese@mitre.org) Received: from avsrv1.mitre.org (avsrv1.mitre.org [129.83.20.58]) by smtpproxy1.mitre.org (8.12.9/8.12.8) with ESMTP id h37EM82t014719; Mon, 7 Apr 2003 10:22:09 -0400 (EDT) Received: from MAILHUB1 (mailhub1.mitre.org [129.83.20.31]) by smtpsrv1.mitre.org (8.12.9/8.12.8) with ESMTP id h37EM7Cg021024; Mon, 7 Apr 2003 10:22:07 -0400 (EDT) Received: from mm112324-2k.mitre.org (128.29.3.65) by mailhub1.mitre.org with SMTP id 1854807; Mon, 07 Apr 2003 10:22:02 -0400 Message-ID: <3E918988.9000402@mitre.org> Date: Mon, 07 Apr 2003 10:22:00 -0400 From: Jason Andresen User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.3) Gecko/20030312 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Eric Timme (by way of Eric Timme\\ )" References: <200304070901.20557.timothy@voidnet.com> In-Reply-To: <200304070901.20557.timothy@voidnet.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit cc: freebsd-stable@freebsd.org Subject: Re: 4-stable and C rand()? X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 08 Apr 2003 05:32:40 -0000 Eric Timme (by way of Eric Timme ) wrote: > Hi everyone, sorry if this has been answered before - I caught a whiff of a > discussion about c's rand() function in a mailing list archive, but couldn't > find a definitive answer. > > I'm trying to do a simple CS project on my machine where I generate two sets > of values in parallel using rand() and am running into infinite loops of > values, and couldn't figure out why, so I wrote a test program: > > #include > #include > #include > > int main() > { > int a, b; > srand((unsigned)time(0)); > > for (int i=0 ; i < 50 ; i++) > cout << rand() % 32 << " " << rand() % 4 << endl; > > return 0; > } > > No matter how many times I run this it seems to alternate between generating > two different but non-unique sets of values, depending on whether time(0) is > even or odd..and I can't understand why (values at the end of this message). > > My uname -a is: > FreeBSD repose 4.8-RC FreeBSD 4.8-RC #0: Mon Mar 24 09:13:35 CST 2003 > timothy@repose:/usr/obj/usr/src/sys/Repose i386 > > It seems like the consensus on the thread I read was to use /dev/random or > /dev/urandom..but this isn't really an option for a CS project a TA has to > grade, so I've had to SSH out to finish the project. I just want to know > what I'm doing wrong, and why I can't do this on my FreeBSD machine =\ If using random() is truely out of the question, you might try using some of the other bits in the returned number. The results wont' be very random, but at least they won't be annoyingly cyclic. Something like: cout << ( rand() >> 5 ) % 32 << " " << ( rand() >> 5 ) % 4 << endl; You should be aware that FreeBSD isn't the only platform with a lousy rand() function. There is a good chance the rand() on your TA's machine is going to return results like this as well. You may want to use configure if possible to test for the existence of a better random number generator, and use that instead if possible. -- \ |_ _|__ __|_ \ __| Jason Andresen jandrese@mitre.org |\/ | | | / _| Network and Distributed Systems Engineer _| _|___| _| _|_\___| Office: 703-883-7755