function [ value, jsr ] = shr3 ( jsr )

%*****************************************************************************80
%
%% SHR3 evaluates the SHR3 generator for integers.
%
%  Discussion:
%
%    The input and output values are all unsigned 32 bit integers.
%
%  Licensing:
%
%    This code is distributed under the GNU LGPL license.
%
%  Modified:
%
%    01 May 2008
%
%  Author:
%
%    Original C version by George Marsaglia, Wai Wan Tsang
%    MATLAB version by John Burkardt
%
%  Reference:
%
%    George Marsaglia, Wai Wan Tsang,
%    The Ziggurat Method for Generating Random Variables,
%    Journal of Statistical Software,
%    Volume 5, Number 8, October 2000, seven pages.
%
%  Parameters:
%
%    Input, uint32 JSR, the seed.
%
%    Output, uint32 SHR3, the value of the SHR3 generator.
%
%    Output, uint32 JSR, the updated seed.
%
  jsr_input = uint32 ( jsr );

  jsr = uint32 ( bitxor ( jsr, uint32 ( bitshift ( jsr, + 13 ) ) ) );
  jsr = uint32 ( bitxor ( jsr, uint32 ( bitshift ( jsr, - 17 ) ) ) );
  jsr = uint32 ( bitxor ( jsr, uint32 ( bitshift ( jsr, +  5 ) ) ) );
%
%  We simply want to add JSR_INPUT and JSR and ignore the overflow digits.
%  But if we add two UINT32's and overflow, MATLAB sets the result to the
%  maximum 32 bit integer!
%
%  To avoid this, until I get smarter, we convert both UINT32's to doubles,
%  add them, subtract the maximum 32 bit integer + 1 (the overflow digit),
%  and convert back.  How ghastly.
%
  goof = double ( jsr_input ) + double ( jsr );
  if ( 4294967296 <= goof )
    goof = goof - 4294967296;
  end
  value = uint32 ( goof );

  return
end

johannesgerer
github-repos/MATLAB/johannesgerer-jburkardt-m/jburkardt-m-1726deb4a34dd08a49c26359d44ef47253f006c1/ziggurat/shr3.m
jburkardt-m
github-repos/MATLAB/johannesgerer-jburkardt-m
1726deb4a34dd08a49c26359d44ef47253f006c1