On 16-07-14 17:55:00, Edgar Pettijohn wrote:
> On 16-07-14 12:00:21, Philippe Meunier wrote:
> > Hello,
> > 
> > According to jot(1)'s man page:
> > 
> > "$ jot -w %d -r 100000 1 4 | sort -n | uniq -c
> > 33306 1
> > 33473 2
> > 33221 3
> > 
> > Note that with random sequences, all numbers generated will be smaller
> > than the upper bound.  The largest value generated will be a tiny bit
> > smaller than the upper bound.  For floating point formats, the value
> > is rounded as described before being printed.  For integer formats,
> > the highest value printed will be one less than the requested upper
> > bound, because the generated value will be truncated."
> > 
> > The "smaller than the upper bound" part used to be correct but not
> > anymore:
> > 
> > $ uname -a
> > OpenBSD something.somewhere 5.9 GENERIC#1561 i386
> > $ jot -w %d -r 100000 1 4 | sort -n | uniq -c
> > 24729 1
> > 25035 2
> > 25106 3
> > 25130 4
> > 
> > Looking at the cvs log for jot.c, this seems to be a known change:
> > 
> > "revision 1.27 [...] Internally, jot -r now uses arc4random_uniform()
> > whenever this is clearly possible.  In particular `jot -r 1 10 20'
> > yields an unbiased random number between 10 and 20 (both ends
> > inclusive) from the shell."
> > 
> > I only discovered this change today after noticing that one of my
> > shell scripts that used to work fine had started to fail with a low
> > probability: the script uses jot(1) to generate a sequence of random
> > array indexes, and with this change an index can now be out of bounds
> > with a probability of about 1/1700.  Fortunately it isn't an important
> > script but given the low probability of failure it wasn't exactly fun
> > to debug.  Anyway, I don't know which one of jot or jot's man page is
> > going to be fixed but I'd advocate for reverting to the previous
> > behavior to preserve the semantics of scripts that rely on it.
> > 
> > Cheers,
> > 
> > Philippe
> > 
> Try this patch.  I don't use jot, but in my simple testing I think this is
> what you are looking for.
> -- 
> Edgar Pettijohn
> Index: jot.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/jot/jot.c,v
> retrieving revision 1.27
> diff -u -p -u -r1.27 jot.c
> --- jot.c     10 Jan 2016 01:15:52 -0000      1.27
> +++ jot.c     14 Jul 2016 22:53:41 -0000
> @@ -296,7 +296,6 @@ main(int argc, char *argv[])
>                       uintx = pow10 * (ender - begin);
>                       if (uintx >= UINT32_MAX)
>                               errx(1, "requested range too large");
> -                     uintx++;
>               }
>  
>               for (i = 1; i <= reps || infinity; i++) {
> 

This ends up breaking other use cases.  
-- 
Edgar Pettijohn

Reply via email to