changeset 28112:d320728d5d06

style fixes for rng; document and mention in NEWS file * rng.m: Style fixes. * NEWS: Mention new function. * stats.txi: Add @DOCSTRING entry.
author John W. Eaton <jwe@octave.org>
date Wed, 19 Feb 2020 10:09:18 -0500
parents c08d7b53f1a2
children 8e8a6e6ddf9c
files NEWS doc/interpreter/stats.txi scripts/general/rng.m
diffstat 3 files changed, 30 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Wed Feb 19 10:02:09 2020 -0500
+++ b/NEWS	Wed Feb 19 10:09:18 2020 -0500
@@ -13,7 +13,7 @@
 
 ### Alphabetical list of new functions added in Octave 7
 
-* `XXX`
+* `rng`
 
 ### Deprecated functions and properties
 
--- a/doc/interpreter/stats.txi	Wed Feb 19 10:02:09 2020 -0500
+++ b/doc/interpreter/stats.txi	Wed Feb 19 10:09:18 2020 -0500
@@ -284,3 +284,5 @@
 @DOCSTRING(discrete_rnd)
 
 @DOCSTRING(empirical_rnd)
+
+@DOCSTRING(rng)
--- a/scripts/general/rng.m	Wed Feb 19 10:02:09 2020 -0500
+++ b/scripts/general/rng.m	Wed Feb 19 10:09:18 2020 -0500
@@ -75,8 +75,8 @@
 
 function retval = rng (varargin)
 
-  if (nargin > 2 || nargout > 1)
-    print_usage ();
+  if (nargin > 2)
+    print_usage ();
   endif
 
   ## Store current settings of random number generator
@@ -87,17 +87,21 @@
   ## FIXME: rand and randn use different generators - storing both states.
   ## For older Matlab generators (v4, v5), the settings are stored like this:
   ##   struct ("Type","Legacy", "Seed", "Not applicable", "State",{[],[],...})
-  s = struct (...
-  "Type", "twister",...                        # generator name
-  "Seed", "Not applicable",...                 # seed initialization value
-  "State", {{rand("state"), randn("state")}}); # internal state of the generator
 
-  if (! nargin)
+  ## Type is the generator name.
+  ## Seed is the initial seed value.
+  ## State is a structure describing internal state of the generator.
+  s = struct ("Type", "twister",
+              "Seed", "Not applicable",
+              "State", {{rand("state"), randn("state")}});
+
+  if (nargin == 0)
     retval = s;
     return;
   endif
 
-  if (isscalar (varargin{1}) && isnumeric (varargin{1}) && isreal (varargin{1}) && varargin{1} >= 0)
+  if (isscalar (varargin{1}) && isnumeric (varargin{1})
+      && isreal (varargin{1}) && varargin{1} >= 0)
     s_rand = s_randn = varargin{1};
     generator = check_generator (varargin(2:end));
 
@@ -106,14 +110,15 @@
     s_rand = s_randn = "reset"; # or sum (1000*clock)
     generator = check_generator (varargin(2:end));
 
-  elseif (ischar (varargin{1}) && strcmpi (varargin{1}, "default") && nargin == 1)
-    generator = "twister";
+  elseif (ischar (varargin{1}) && strcmpi (varargin{1}, "default")
+          && nargin == 1)
+    generator = "twister";
     s_rand = s_randn = 0; # In Matlab, seed 0 corresponds to 5489
 
   elseif (isstruct (varargin{1}) && isscalar (varargin{1}) && nargin == 1)
     if (numfields (varargin{1}) != 3 || ! isfield (varargin{1}, "Type")
-      || ! isfield (varargin{1}, "Seed") || ! isfield (varargin{1}, "State"))
-      error ("Input structure not compatible with the one returned by rng ()");
+        || ! isfield (varargin{1}, "Seed") || ! isfield (varargin{1}, "State"))
+      error ("input structure not compatible with the one returned by rng ()");
     endif
     ## Only the internal state "State" and generator type "Type" are needed
     generator = varargin{1}.Type;
@@ -140,15 +145,15 @@
       rand ("seed", s_rand);
       randn ("seed", s_randn);
 
-    case "v5uniform"
+    case "v5uniform"
       rand ("seed", s_rand);
 
     case "v5normal"
       randn ("seed", s_randn);
 
   otherwise
-    error ("Unknown type of random number generator");
-    
+    error ("unknown type of random number generator");
+
   endswitch
 
   if (nargout > 0)
@@ -163,13 +168,13 @@
     gen = "";
     return;
   elseif (! iscellstr (val))
-    error ("Second input must be a type of random number generator");
+    error ("second input must be a type of random number generator");
   endif
   gen = tolower (char (val));
   if (ismember (gen, {"simdtwister", "combrecursive", "philox", "threefry", "multfibonacci", "v4"}))
-    error ("This random number generator is not available in Octave");
+    error ("random number generator '%s' is not available in Octave", gen);
   elseif (! ismember (gen, {"twister", "v5uniform", "v5normal"}))
-    error ("This type of random number generator is unknown");
+    error ("unknown random number generator '%s'", gen);
   endif
 endfunction
 
@@ -255,7 +260,6 @@
 
 ## Test input validation
 %!error <Invalid call> rng (1, 2, 3)
-%!error <Invalid call> [a, b] = rng ()
 %!error <Invalid call> rng ({})
 %!error <Invalid call> rng ("unknown")
 %!error <Invalid call> rng (eye (2))
@@ -263,7 +267,7 @@
 %!error <Invalid call> rng (-1)
 %!error <Invalid call> rng (struct ("Type",[],"State",[],"Seed",[]), 2)
 %!error <Invalid call> rng ("default", "twister")
-%!error <Second input must be a type of random number generator> rng (0, struct ())
-%!error <This type of random number generator is unknown> rng (0, "unknown")
-%!error <Second input must be a type of random number generator> rng ("shuffle", struct ())
-%!error <This type of random number generator is unknown> rng ("shuffle", "unknown")
+%!error <second input must be a type of random number generator> rng (0, struct ())
+%!error <unknown random number generator> rng (0, "unknown")
+%!error <second input must be a type of random number generator> rng ("shuffle", struct ())
+%!error <unknown random number generator> rng ("shuffle", "unknown")