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