From cff2f506464abf93c35feb6d644ad08b79feb856 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Fri, 21 Oct 2016 22:57:58 +0200
Subject: Initialized the libc random generator using the time and the process
 ID.

---
 ChangeLog            |  8 ++++++++
 src/common/shuffle.c | 17 ++++++++++++++---
 src/core/core.c      |  7 +++++++
 3 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 62a1bc6..ee1fa84 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 16-10-21  Cyrille Bagard <nocbos@gmail.com>
 
+	* src/common/shuffle.c:
+	Avoid to copy overlapping memory areas.
+
+	* src/core/core.c:
+	Initialize the libc random generator using the time and the process ID.
+
+16-10-21  Cyrille Bagard <nocbos@gmail.com>
+
 	* src/gtkext/graph/cluster.c:
 	* src/gtkext/graph/edge.c:
 	* src/gtkext/graph/edge.h:
diff --git a/src/common/shuffle.c b/src/common/shuffle.c
index 6b20866..e2e0a3d 100644
--- a/src/common/shuffle.c
+++ b/src/common/shuffle.c
@@ -53,6 +53,14 @@ void shuffle(void *base, size_t nmemb, size_t size)
      * Application de l'algorithme Fisher-Yates.
      *
      * Cf. https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
+     *
+     * En version hors-ligne, cela donne :
+     *
+     *    -- To shuffle an array a of n elements (indices 0..n-1):
+     *    for i from 0 to nāˆ’2 do
+     *        j ā† random integer such that i ā‰¤ j < n
+     *        exchange a[i] and a[j]
+     *
      */
 
     if (nmemb > 1)
@@ -65,9 +73,12 @@ void shuffle(void *base, size_t nmemb, size_t size)
         {
             j = i + rand() % (nmemb - i);
 
-            memcpy(tmp, list + i * size, size);
-            memcpy(list + i * size, list + j * size, size);
-            memcpy(list + j * size, tmp, size);
+            if (j != i)
+            {
+                memcpy(tmp, list + i * size, size);
+                memcpy(list + i * size, list + j * size, size);
+                memcpy(list + j * size, tmp, size);
+            }
 
         }
 
diff --git a/src/core/core.c b/src/core/core.c
index ec7b0fc..b949e0a 100644
--- a/src/core/core.c
+++ b/src/core/core.c
@@ -24,6 +24,11 @@
 #include "core.h"
 
 
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+
+
 #include <config.h>
 
 
@@ -62,6 +67,8 @@ bool load_all_basic_components(void)
     {
         result = true;
 
+        srand(time(NULL) + getpid());
+
         add_pixmap_directory(PACKAGE_DATA_DIR);
         add_pixmap_directory(PACKAGE_SOURCE_DIR G_DIR_SEPARATOR_S "pixmaps");
 
-- 
cgit v0.11.2-87-g4458