diff --git a/Makefile b/Makefile
index 8c350487dae05d2302c0f7cf27974c533f08e8b1..146c8c656c4aacc50debdbe7a16936ef810cc1cd 100644
--- a/Makefile
+++ b/Makefile
@@ -3,10 +3,10 @@ CFLAGS = -g -O0 -Wall
 all: swiftmpistepsim swiftmpifakestepsim
 
 swiftmpistepsim: swiftmpistepsim.c mpiuse.c mpiuse.h atomic.h cycle.h clocks.h clocks.c
-	mpicc $(CFLAGS) -o swiftmpistepsim swiftmpistepsim.c mpiuse.c clocks.c -lpthread
+	mpicc $(CFLAGS) -o swiftmpistepsim swiftmpistepsim.c mpiuse.c clocks.c -lpthread -lm
 
 swiftmpifakestepsim: swiftmpifakestepsim.c mpiuse.c mpiuse.h atomic.h cycle.h clocks.h clocks.c
-	mpicc $(CFLAGS) -o swiftmpifakestepsim swiftmpifakestepsim.c mpiuse.c clocks.c -lpthread
+	mpicc $(CFLAGS) -o swiftmpifakestepsim swiftmpifakestepsim.c mpiuse.c clocks.c -lpthread -lm
 
 clean:
 	rm -f swiftmpistepsim
diff --git a/mpiuse.c b/mpiuse.c
index b8f6ddfa4ca02fba008372b4a945fdb14d595359..c194495b98c0f4f8c2fb06d52c3da45268c2f3d1 100644
--- a/mpiuse.c
+++ b/mpiuse.c
@@ -22,6 +22,7 @@
  */
 
 /* Standard includes. */
+#include <math.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -258,18 +259,39 @@ struct mpiuse_log_entry *mpiuse_get_log(int ind) {
   return NULL;
 }
 
+/**
+ * @brief return random number from a upper part of gaussian distribution.
+ *
+ * @result the random.
+ */
+static double gauss_rand_upper(void) {
+
+  double V1, V2, S;
+  do {
+    double U1 = drand48();
+    double U2 = drand48();
+
+    V1 = U1 - 1.0;
+    V2 = U2 - 1.0;
+    S = V1 * V1 + V2 * V2;
+  } while(S >= 1.0 || S == 0.0);
+
+  return fabs(V1 * sqrt(-2.0 * log(S) / S));
+}
+
 /**
  * @brief generate a list of fake exchanges as mpiuse logs.
  *
  * @param nr_nodes the number of ranks that will be used.
  * @param nr_logs the number of logs to generate per rank.
  * @param size bytes per message, unless random when this is the maximum
- *             and the minimum is 1.
+ *             and the minimum is 1 for uniform and 2.5 sigma for gaussian.
  * @param random whether to use random sizes.
  * @param seed the random seed, use same for fixed sequences.
+ * @param uniform whether to use a uniform distribution.
  */
 void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random,
-                         long int seed) {
+                         long int seed, int uniform) {
 
   /* Each rank exchanges messages with all the others and each "log" has the
    * same size. */
@@ -277,8 +299,18 @@ void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random,
 
   int tag = 1;
   for (int k = 0; k < nr_logs; k++) {
+
+    /* Set size for this messages. */
     int logsize = size;
-    if (random) logsize = (drand48() * (double)size) + 1;
+    if (random) {
+      if (uniform) {
+        logsize = (drand48() * (double)size) + 1;
+      } else {
+        // Gaussian so no maximum, assume size is 2.5 sigma.
+        logsize = (gauss_rand_upper() * (double)size * 0.25) + 1;
+      }
+    }
+
     for (int i = 0; i < nr_nodes; i++) {
       for (int j = 0; j < nr_nodes; j++) {
         if (i != j) {
diff --git a/mpiuse.h b/mpiuse.h
index 46aaad5974ad2115b60e62edaa06b75326c9e070..feae1e6f7999a30fb79c9aa4b1ed9844a59a1fce 100644
--- a/mpiuse.h
+++ b/mpiuse.h
@@ -102,6 +102,6 @@ int mpiuse_nr_ranks(void);
 void mpiuse_dump_logs(int nranks, const char *logfile);
 
 void mpiuse_log_generate(int nr_nodes, int nr_logs, int size, int random,
-                         long int seed);
+                         long int seed, int uniform);
 
 #endif /* SWIFT_MPIUSE_H */
diff --git a/swiftmpifakestepsim.c b/swiftmpifakestepsim.c
index 50887c8c611f6df9a6aab7a611ba147f6e9d90bc..7d991b752bbc1fb292414f65bf5e3bfd116d1d24 100644
--- a/swiftmpifakestepsim.c
+++ b/swiftmpifakestepsim.c
@@ -341,8 +341,9 @@ static void pick_logs(void) {
 static void usage(char *argv[]) {
   fprintf(stderr, "Usage: %s [-vf] nr_messages logfile.dat\n",
           argv[0]);
-  fprintf(stderr, " options: -v verbose, -d data check, -s size (bytes), -r"
-          " random from 0 to size\n");
+  fprintf(stderr, " options: -v verbose, -d data check, -s size (bytes), "
+          "-r uniform random from 1 to size, "
+          "-r -g half gaussian random from 1 with 2.5 sigma size.\n");
   fflush(stderr);
 }
 
@@ -370,8 +371,9 @@ int main(int argc, char *argv[]) {
    * whether to use a random selection (with a fixed seed). */
   int size = 1024;
   int random = 0;
+  int uniform = 1;
   int opt;
-  while ((opt = getopt(argc, argv, "vds:r")) != -1) {
+  while ((opt = getopt(argc, argv, "vds:rg")) != -1) {
     switch (opt) {
       case 'd':
         datacheck = 1;
@@ -382,6 +384,9 @@ int main(int argc, char *argv[]) {
       case 'r':
         random = 1;
         break;
+      case 'g':
+        uniform = 0;
+        break;
       case 'v':
         verbose = 1;
         break;
@@ -403,14 +408,19 @@ int main(int argc, char *argv[]) {
   /* Generate the fake logs for the exchanges. */
   if (myrank == 0) {
     if (random) {
-      message("Generating %d fake logs for %d ranks with random distribution"
-              " up to size %d", nr_logs, nr_nodes, size);
+      if (uniform) {
+        message("Generating %d fake logs for %d ranks with random distribution"
+                " using size %d", nr_logs, nr_nodes, size);
+      } else {
+        message("Generating %d fake logs for %d ranks with gaussian random "
+                "distribution using size %d as 2.5 sigma", nr_logs, nr_nodes, size);
+      }
     } else {
       message("Generating %d fake logs for %d ranks of size %d",
               nr_logs, nr_nodes, size);
     }
   }
-  mpiuse_log_generate(nr_nodes, nr_logs, size, random, seed);
+  mpiuse_log_generate(nr_nodes, nr_logs, size, random, seed, uniform);
   int nranks = mpiuse_nr_ranks();
 
   /* Each rank requires its own queue, so extract them. */