From b1b8bc10963b635d1ee4ef27bb48f92cbac98a63 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Mon, 18 Apr 2016 15:39:55 +0200 Subject: [PATCH] also fail in `CCRandom.sample_without_replacement` if `n<=0` --- src/core/CCRandom.ml | 6 ++++-- src/core/CCRandom.mli | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/core/CCRandom.ml b/src/core/CCRandom.ml index 788adab0..9116c2cf 100644 --- a/src/core/CCRandom.ml +++ b/src/core/CCRandom.ml @@ -85,7 +85,9 @@ let sample_without_replacement (type elt) ?(compare=compare) k (rng:elt t) st= if S.mem x s then aux s k else - aux (S.add x s) (k-1) in + aux (S.add x s) (k-1) + in + if k<=0 then invalid_arg "sample_without_replacement"; aux S.empty k let list_seq l st = List.map (fun f -> f st) l @@ -112,7 +114,7 @@ let _diff_list ~last l = If we define, y_k = x_{k+1} - x_{k} for k in 0..(len-1), then by construction ∑_k y_k = ∑_k (x_{k+1} - x_k ) = x_{len} - x_0 = i. *) let split_list i ~len st = - if len=0 then invalid_arg "Random.split_list"; + if len <= 0 then invalid_arg "Random.split_list"; if i >= len then let xs = sample_without_replacement (len-1) (int_range 1 (i-1)) st in _diff_list ( 0::xs ) ~last:i diff --git a/src/core/CCRandom.mli b/src/core/CCRandom.mli index 888c6154..0f203249 100644 --- a/src/core/CCRandom.mli +++ b/src/core/CCRandom.mli @@ -58,6 +58,7 @@ val sample_without_replacement: (** [sample_without_replacement n g] makes a list of [n] elements which are all generated randomly using [g] with the added constraint that none of the generated random values are equal + @raise Invalid_argument if [n <= 0] @since 0.15 *) val list_seq : 'a t list -> 'a list t @@ -104,7 +105,7 @@ val split_list : int -> len:int -> int list option t (** Split a value [n] into a list of values whose sum is [n] and whose length is [length]. The list is never empty and does not contain [0]. - @raise Invalid_argument if [len=0] + @raise Invalid_argument if [len <= 0] @return [None] if the value is too small *) val retry : ?max:int -> 'a option t -> 'a option t