From owner-freebsd-hackers@FreeBSD.ORG Thu Aug 28 16:24:02 2014 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id DB362D7C for ; Thu, 28 Aug 2014 16:24:02 +0000 (UTC) Received: from mail-we0-x231.google.com (mail-we0-x231.google.com [IPv6:2a00:1450:400c:c03::231]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 704DA1D47 for ; Thu, 28 Aug 2014 16:24:02 +0000 (UTC) Received: by mail-we0-f177.google.com with SMTP id u56so1014791wes.22 for ; Thu, 28 Aug 2014 09:24:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=HD/IuZeIn0m3jOXtFZPwB5T+r51I0nDx19RioiWAe54=; b=HYrcvJV9wCnWoDWiz3EHO2rskPLlPkdObiP4uHhnqvlmYk39oC8xX0uYh8UDXzLXmD mqLRXyieHJlF9NQgdL1oUsbgIbOQVRszG1+7FnLUIs71jknCDobz5UaHGErkbjmIF2pO 2ItE1kAXqz8S8jnf4M+AfC49w12DT166cJlGhh0m4VS1HXJ0P0Qu/aK5HTwIovpNaylD bXt0oIPTgoY/2MYw3x1KWGAxdRyy4GlXY91UWTdHtxaR5f2krUQycrQ1TrCDm6JeUie+ sbTAIMetGzqm0fn+jQQcohUbirccXONC7dQjU2Bw6q4LrDm0nwnGl2NMjAw7OBC8cdEV zHSA== X-Received: by 10.180.189.195 with SMTP id gk3mr23722968wic.82.1409243040629; Thu, 28 Aug 2014 09:24:00 -0700 (PDT) Received: from [172.16.0.2] (tx97.net. [85.198.160.156]) by mx.google.com with ESMTPSA id n5sm11083280wja.38.2014.08.28.09.23.59 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 28 Aug 2014 09:24:00 -0700 (PDT) Message-ID: <53FF574E.1090108@gmail.com> Date: Thu, 28 Aug 2014 19:22:38 +0300 From: Vitaly Magerya User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: Chenguang Li , Peter Pentchev Subject: Re: On changing rand(3) to random(3) in awk(1) References: <53FEFBB8.5040305@gmail.com> <20140828131526.GA2385@straylight.m.ringlet.net> <5C40F611-22EB-49E4-8925-37922E771C0F@gmail.com> In-Reply-To: <5C40F611-22EB-49E4-8925-37922E771C0F@gmail.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: freebsd-hackers@freebsd.org X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Aug 2014 16:24:02 -0000 On 08/28/14 16:28, Chenguang Li wrote: > I am using RANDOM_MAX here to maintain the original code structure. > I've updated my patch, please check the gist. Thanks! > jmp_buf env; > extern int pairstack[]; > @@ -1522,7 +1522,7 @@ > break; > case FRAND: > /* in principle, rand() returns something in 0..RAND_MAX */ > - u = (Awkfloat) (rand() % RAND_MAX) / RAND_MAX; > + u = (Awkfloat) (random() % RANDOM_MAX) / RANDOM_MAX; > break; > case FSRAND: > if (isrec(x)) /* no argument provided */ OK, so this part is wrong (and it is wrong in the original sources too): this construction generates 0.0 twice as often as it generates other numbers -- both when random() returns 0 and when it returns RANDOM_MAX. The correct construction is this: > case FRAND: > - /* in principle, rand() returns something in 0..RAND_MAX */ > - u = (Awkfloat) (rand() % RAND_MAX) / RAND_MAX; > + /* random() returns values in [0, RANDOM_MAX] */ > + u = (Awkfloat) random() / (RANDOM_MAX + 1ul); > break; Note that the "ul" part in "1ul" is vitally important: otherwise there will be an overflow on systems where long is 32 bit wide. Alternatively "1.0" can be used here instead. (Because this overflow may not be obvious in a casual reading, I'm not a fan of defining RANDOM_MAX separately; I personally would insert the actual number here directly).