diff --git a/tools/simulator.py b/tools/simulator.py
index 72679b791..f77e58ce3 100755
--- a/tools/simulator.py
+++ b/tools/simulator.py
@@ -14,6 +14,7 @@ import eventlet
 eventlet.monkey_patch()
 
 import argparse
+import bisect
 import collections
 import datetime
 import itertools
@@ -27,8 +28,6 @@ import threading
 import time
 import yaml
 
-from scipy.stats import rv_discrete
-
 from oslo_config import cfg
 import oslo_messaging as messaging
 from oslo_messaging import notify  # noqa
@@ -36,7 +35,7 @@ from oslo_messaging import rpc  # noqa
 from oslo_utils import timeutils
 
 LOG = logging.getLogger()
-RANDOM_VARIABLE = None
+RANDOM_GENERATOR = None
 CURRENT_PID = None
 RPC_CLIENTS = []
 MESSAGES = []
@@ -51,6 +50,8 @@ Usage example:
  --url rabbit://stackrabbit:secretrabbit@localhost/ rpc-client\
  --exit-wait 15000 -p 64 -m 64"""
 
+DISTRIBUTION_BUCKET_SIZE = 500
+
 
 def init_random_generator():
     data = []
@@ -61,18 +62,26 @@ def init_random_generator():
 
     ranges = collections.defaultdict(int)
     for msg_length in data:
-        range_start = (msg_length / 500) * 500 + 1
+        range_start = ((msg_length / DISTRIBUTION_BUCKET_SIZE) *
+                       DISTRIBUTION_BUCKET_SIZE + 1)
         ranges[range_start] += 1
 
     ranges_start = sorted(ranges.keys())
     total_count = len(data)
-    ranges_dist = []
-    for r in ranges_start:
-        r_dist = float(ranges[r]) / total_count
-        ranges_dist.append(r_dist)
 
-    random_var = rv_discrete(values=(ranges_start, ranges_dist))
-    return random_var
+    accumulated_distribution = []
+    running_total = 0
+    for range_start in ranges_start:
+        norm = float(ranges[range_start]) / total_count
+        running_total += norm
+        accumulated_distribution.append(running_total)
+
+    def weighted_random_choice():
+        r = random.random() * running_total
+        start = ranges_start[bisect.bisect_right(accumulated_distribution, r)]
+        return random.randrange(start, start + DISTRIBUTION_BUCKET_SIZE)
+
+    return weighted_random_choice
 
 
 class LoggingNoParsingFilter(logging.Filter):
@@ -214,10 +223,9 @@ def init_msg(messages_count):
     if messages_count > 1000:
         messages_count = 1000
     LOG.info("Preparing %d messages", messages_count)
-    ranges = RANDOM_VARIABLE.rvs(size=messages_count)
-    i = 0
-    for range_start in ranges:
-        length = random.randint(range_start, range_start + 497)
+
+    for i in range(messages_count):
+        length = RANDOM_GENERATOR()
         msg = ''.join(random.choice(string.lowercase) for x in range(length)) \
               + ' ' + str(i)
         MESSAGES.append(msg)
@@ -472,6 +480,6 @@ def main():
 
 
 if __name__ == '__main__':
-    RANDOM_VARIABLE = init_random_generator()
+    RANDOM_GENERATOR = init_random_generator()
     CURRENT_PID = os.getpid()
     main()