No description
Find a file
Sergei Trofimovich 9251546bac Fix biased shuffle by avoiding already "struck" elements
Artem Klimov noticed that current shuffle implementation suffers from
probability bias due to a typical bug in the shuffling implementation.

When we consider already shuffled element we slightly bias their
propability.

https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm
suggests shuffling each "struck" element only once.

Before the change probabilities of 4-element array to land from `i`
index to `j` index are:

          0     1     2     3
      _____ _____ _____ _____
  0 | 25.00 29.30 24.60 21.10
  1 | 25.00 22.25 28.13 24.63
  2 | 25.00 23.44 22.26 29.30
  3 | 25.00 25.01 25.01 24.98

Note that `0->1` probability is almost 29% while `0->3` os only 21%.

After the change probabilities are not as biased:

          0     1     2     3
      _____ _____ _____ _____
  0 | 24.99 24.99 25.01 25.01
  1 | 24.99 25.04 24.99 24.99
  2 | 25.01 25.00 25.00 24.99
  3 | 25.01 24.98 25.00 25.01

* src/shuffle.c (random_shuffle_array): Fix biased shuffle by avoiding
already "struck" elements.
2024-09-02 15:11:36 -04:00
doc * doc/make.texi: GNUMAKEFLAGS is only read from the environment 2024-09-02 14:54:23 -04:00
gl Remove obsolete email address for the FSF 2024-09-01 21:12:37 -04:00
mk * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
po * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
scripts * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
src Fix biased shuffle by avoiding already "struck" elements 2024-09-02 15:11:36 -04:00
tests [SV 65917] Mark also_make targets as updated in make -n 2024-08-04 23:53:26 -04:00
.ccls * .clangd: Add configuration for the clangd LSP server 2024-01-01 19:24:37 -05:00
.clangd * .clangd: Add configuration for the clangd LSP server 2024-01-01 19:24:37 -05:00
.dir-locals.el * .dir-locals.el: Correct bug reference regex format 2024-04-14 15:51:23 -04:00
.gitignore Add a UTF-8 resource when building for Windows 2023-06-19 13:29:52 -04:00
AUTHORS [SV 65917] Mark also_make targets as updated in make -n 2024-08-04 23:53:26 -04:00
autogen.sh * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
autopull.sh * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
Basic.mk.template * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
bootstrap Update to the latest gnulib stable branch 2023-01-01 17:05:12 -05:00
bootstrap-funclib.sh * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
bootstrap.bat * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
bootstrap.conf * bootstrap.conf: Update to newer prerequisites 2024-09-01 21:09:42 -04:00
build.cfg.in * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
build.sh * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
build_w32.bat * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
builddos.bat * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
ChangeLog.1 Update URLs to use https rather than http 2022-10-18 14:37:47 -04:00
ChangeLog.2 Update URLs to use https rather than http 2022-10-18 14:37:47 -04:00
ChangeLog.3 Update URLs to use https rather than http 2022-10-18 14:37:47 -04:00
configure.ac [SV 65273] configure.ac: Remove check for sys/timeb.h 2024-03-24 15:25:18 -04:00
COPYING
maintMakefile [SV 65537] Update to newer gnulib 2024-04-14 15:27:37 -04:00
make-gdb.py * NEWS: Use GNU Make instead of GNU make 2022-10-18 14:37:47 -04:00
Makefile.am * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
makefile.com * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
NEWS [SV 65739] Add warning circular-dep. 2024-08-04 15:21:59 -04:00
prepare_vms.com Remove template files to simplify distribution creation 2022-10-18 14:20:44 -04:00
README.customs * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
README.DOS * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
README.git [SV 65537] Update to newer gnulib 2024-04-14 15:27:37 -04:00
README.in * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
README.OS2 * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
README.VMS * NEWS: Use GNU Make instead of GNU make 2022-10-18 14:37:47 -04:00
README.W32 * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
README.zOS [SV 62654] Support GNU Make on z/OS 2023-01-08 10:45:38 -05:00
TODO.private * (all): Update Copyright year to 2024 2024-01-06 18:06:09 -05:00
vms_export_symbol_test.com

                                                                     -*-text-*-
GNU Make has been ported to z/OS, tested on z/OS V2R4.


PREREQUISITES
-------------
Building GNU Make requires certain tools be installed on your z/OS system.
These tools can be downloaded from: https://github.com/ZOSOpenTools
For detailed instructions on how to set up these tools, visit
https://zosopentools.github.io/meta/#/Guides/Pre-req

You will need curl, tar, and gzip to download and unpack the GNU Make release
package, but presumably you've already worked this out if you're reading this
document!

You will need the IBM C/C++ compiler.  You can download a web deliverable
add-on feature to your XL C/C++ compiler here:
https://www-40.ibm.com/servers/resourcelink/svc00100.nsf/pages/xlCC++V241ForZOsV24

Alternatively, you can install and manage C/C++ for Open Enterprise Languages
on z/OS using RedHat OpenShift Container Platform and IBM Z and Cloud
Modernization Stack.

GNU Make has a dependency on the ZOSLIB library, which is documented here:
https://zosopentools.github.io/meta/#/Guides/Zoslib.

To obtain the latest release of zoslib, you can download it from here:
https://github.com/ZOSOpenTools/zoslibport/releases.


BUILDING
--------
If you are trying to build from a checked-out Git workspace, see README.git.

Before building GNU Make, you will need to ensure that the following
environment variables are set, to turn on z/OS enhanced ASCII support:

  export _BPXK_AUTOCVT=ON
  export _CEE_RUNOPTS="$_CEE_RUNOPTS FILETAG(AUTOCVT,AUTOTAG) POSIX(ON)"
  export _TAG_REDIR_ERR=txt
  export _TAG_REDIR_IN=txt
  export _TAG_REDIR_OUT=txt

To ensure proper functioning of xlclang, set the following environment
variables before building:

  export _CC_CCMODE=1
  export _C89_CCMODE=1
  export _CXX_CCMODE=1

Set PATH_TO_ZOSLIB to the location of your zoslib installation; e.g.:

  PATH_TO_ZOSLIB=$HOME/zopen/prod/zoslib

Invoke ./configure as follows:

  ./configure \
      CC=xlclang \
      CPPFLAGS="-DNSIG=42 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE -D_OPEN_SYS_FILE_EXT=1 -D_AE_BIMODAL=1 -D_ENHANCED_ASCII_EXT=0xFFFFFFF -DZOSLIB_OVERRIDE_CLIB=1" \
      CFLAGS="-qascii -std=gnu11 -qnocsect -qenum=int -I$PATH_TO_ZOSLIB/include" \
      LDFLAGS="-L$PATH_TO_ZOSLIB/lib" \
      LIBS="-lzoslib $PATH_TO_ZOSLIB/lib/CXXRT64.x"

If you have an instance of make already available you can build with:

  make

If not, you can build with:

  ./build.sh


TESTING
-------
To run the regression tests you'll need to install Perl and enable it.
Then you can run:

  ./make check


INSTALLING
----------
Copy the "make" program to wherever you want it to be installed, on your PATH.