# HG changeset patch # User Jordi GutiƩrrez Hermoso # Date 1337959442 14400 # Node ID 42edbe6f6a8dfdf392dca54d0a1fdcb84a515d09 # Parent 847ed7f603cfc48aee0546ec1a7007184e797772 Fix bad two-arg call of randperm (bug #36535) * rand.cc (Frandperm): Rewrite algorithm for short_shuffle. Add another test. diff -r 847ed7f603cf -r 42edbe6f6a8d src/DLD-FUNCTIONS/rand.cc --- a/src/DLD-FUNCTIONS/rand.cc Thu May 24 15:36:06 2012 -0400 +++ b/src/DLD-FUNCTIONS/rand.cc Fri May 25 11:24:02 2012 -0400 @@ -1086,14 +1086,19 @@ octave_idx_type k = i + gnulib::floor (rvec[i] * (n - i)); - if (map.find(k) == map.end()) + //For shuffling first m entries, no need to use extra + //storage + if (k < m) { - map[k] = ivec[i]; - ivec[i] = k; + std::swap (ivec[i], ivec[k]); } else - std::swap (ivec[i], map[k]); + { + if (map.find (k) == map.end ()) + map[k] = k; + std::swap (ivec[i], map[k]); + } } } else @@ -1126,6 +1131,13 @@ } /* -%!assert(sort (randperm (20)),1:20) -%!assert(length (randperm (20,10)), 10) +%!assert (sort (randperm (20)), 1:20) +%!assert (length (randperm (20,10)), 10) + +%!test +%! rand ("seed", 0); +%! for i = 1:100 +%! p = randperm (305, 30); +%! assert (length (unique (p)), 30); +%! endfor */