⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 randtx.m

📁 有趣的可视的数值方法 出自网站http://www.mathworks.com/moler
💻 M
字号:
function U = randtx(arg1,arg2)% RANDTX  Text book version of RAND% Uniformly distributed random numbers% This M-file exactly reproduces the numerical% behavior of the builtin RAND function.% Usage:%    randtx                  1-by-1%    randtx(n)               n-by-n%    randtx(m,n)             m-by-n%    s = randtx('state')     Get state%    randtx('state',j)       Set state determined by j%    randtx('state',s)       Restore state% See also RANDpersistent z b i j ulpif isempty(z)   % Initialize the state.   j = 2^31;   z = randsetup(32,j);   b = 0;   i = 0;   ulp = pow2(1,-53);endif nargin > 0 & isequal(arg1,'state')   if nargin == 1      % Get the state.      U = [z; b; pow2(i,-52); pow2(j,-52)];   elseif length(arg2) == 35      % Restore the state.      z = U(1:32);      b = U(33);      i = pow2(U(34),52);      j = pow2(U(35),52);   else      % Set the state determined by j.      j = arg2;      if j == 0, j = 2^31; end      z = randsetup(32,j);      b = 0;      i = 0;   end   returnend% Determine size of output.if nargin == 0   m = 1; n = 1;elseif nargin == 1   m = arg1; n = arg1;else   m = arg1; n = arg2;end% The MATLAB uniform random number generator.U = zeros(m,n);for k = 1:m*n   x = z(mod(i+20,32)+1) - z(mod(i+5,32)+1) - b;   if x < 0      x = x + 1;      b = ulp;   else      b = 0;   end   z(i+1) = x;   i = i+1;   if i == 32, i = 0; end   [x,j] = randbits(x,j);   U(k) = x;end% ----------------------------------------------------function z = randsetup(n,j)% RANDSETUP Generate n floats in [0,1] bit by bit.% z = RANDSETUP(n,j)% Seed is j.   z = zeros(n,1);   for k = 1:n      x = 0;      for d = 1:53         j = randint(j);         x = 2*x + bitand(bitshift(j,-19),1);      end      z(k) = pow2(x,-53);   end% ----------------------------------------------------function j = randint(j)% RANDINT  Shift register random integer generator.% The statement%    j = randint(j)% generates another random integer, 0 <= j <= 2^32-1   j = bitxor(j,bitshift(j,13,32));   j = bitxor(j,bitshift(j,-17,32));   j = bitxor(j,bitshift(j,5,32));% ----------------------------------------------------function [x,jhi] = randbits(x,jlo)% RANDBITS  XOR random integer with floating fraction%    [x,j] = randbits(x,j)   jhi = randint(jlo);   mask = bitxor(bitshift(jhi,32,52),jlo);   [f,e] = log2(x);   x = pow2(bitxor(pow2(f,53),mask),e-53);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -