diff --git a/src/egraph_simple.ml b/src/egraph_simple.ml
index 45d9f8b786b5ae21c33ec50df19d884cac32f84d..1ce92c79dea23ba261944ddaf72a5209a973f53c 100644
--- a/src/egraph_simple.ml
+++ b/src/egraph_simple.ml
@@ -7,28 +7,12 @@
 *)
 
 open Stdlib
+open Shuffle
 
 let debug = Debug.register_info_flag
   ~desc:"for the simple version of the egraph"
   "egraph_simple"
 
-(** {!shuffle} is used for test. It's used want the swap of two value
-    can give different result
-*)
-let opt_shuffle = ref None
-
-let set_shuffle = function
-  | None -> opt_shuffle := None
-  | Some i -> opt_shuffle := Some (Random.State.make i)
-
-let is_shuffle () = !opt_shuffle <> None
-
-let shuffle ((t1,t2) as p) =
-  match !opt_shuffle with
-  | None -> p
-  | Some rnd when Random.State.bool rnd -> p
-  | _ -> (t2,t1)
-
 module UnionFind (* simple *) :
 sig type t
     val empty: t
@@ -173,7 +157,7 @@ let rec equal_aux queue env t1 t2 =
         end
       else
         begin
-          shuffle (parent, parent')
+          shufflep (parent, parent')
         end
     in
     if p1 != p2 then Queue.push (p1,p2) queue;
@@ -187,7 +171,7 @@ let rec equal_aux queue env t1 t2 =
   end
 
 let equal env t1 t2 =
-  let t1,t2 = shuffle (t1,t2) in
+  let t1,t2 = shufflep (t1,t2) in
   let queue = Queue.create () in
   equal_aux queue env t1 t2
 
diff --git a/src/egraph_simple.mli b/src/egraph_simple.mli
index a955ecae67ca7b68a8c1f93e89ef8d47d546d07b..979d85711fc551b74a7c9e0d00c5586fb72bc19b 100644
--- a/src/egraph_simple.mli
+++ b/src/egraph_simple.mli
@@ -1,8 +1,5 @@
 val debug: Debug.flag
 
-val set_shuffle: int array option -> unit
-val is_shuffle: unit -> bool
-
 type env
 
 val empty_env: env
diff --git a/src/util/shuffle.ml b/src/util/shuffle.ml
new file mode 100644
index 0000000000000000000000000000000000000000..9bdb4b68153ad1b2844418a1d8959e5ebf36f199
--- /dev/null
+++ b/src/util/shuffle.ml
@@ -0,0 +1,26 @@
+(** {!shuffle} is used for test. Used for shuffling input entry *)
+let opt_shuffle = ref None
+
+let set_shuffle = function
+  | None -> opt_shuffle := None
+  | Some i -> opt_shuffle := Some (Random.State.make i)
+
+let is_shuffle () = !opt_shuffle <> None
+
+let shufflep ((t1,t2) as p) =
+  match !opt_shuffle with
+  | None -> p
+  | Some rnd when Random.State.bool rnd -> p
+  | _ -> (t2,t1)
+
+
+let shufflel l =
+  match !opt_shuffle with
+  | None -> l
+  | Some rnd ->
+    let rec aux head tail = function
+      | [] -> List.rev_append head tail
+      | a::l when Random.State.bool rnd -> aux (a::head) tail l
+      | a::l                            -> aux head (a::tail) l in
+    aux [] [] l
+
diff --git a/src/util/shuffle.mli b/src/util/shuffle.mli
new file mode 100644
index 0000000000000000000000000000000000000000..bf306179183778bee755da1db5a82ba9f01f9200
--- /dev/null
+++ b/src/util/shuffle.mli
@@ -0,0 +1,11 @@
+
+val set_shuffle: int array option -> unit
+(** if None is given shuffling is disable (default) *)
+
+val is_shuffle: unit -> bool
+
+val shufflep: ('a * 'a) -> ('a * 'a)
+(* uniform *)
+
+val shufflel: 'a list -> 'a list
+(* not uniform *)
diff --git a/tests/tests.ml b/tests/tests.ml
index cef2f67676af4d22caf43d742ab310f268c6a04a..db974968057fd30e82719d5754786bf70341c918 100644
--- a/tests/tests.ml
+++ b/tests/tests.ml
@@ -11,7 +11,7 @@ let rec make_tests acc seed =
   let module Uf = Tests_uf.Tests(Egraph_simple) in
   let test = ((Pp.sprintf "seed %a" print_seed seed) >::: [Uf.tests]) in
   let test = test_decorate
-    (fun f -> (fun () -> Egraph_simple.set_shuffle seed; f ())) test in
+    (fun f -> (fun () -> Shuffle.set_shuffle seed; f ())) test in
   test::acc
 
 let tests =