51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
"""Simulation of random streams of data.
|
|
|
|
This module defines:
|
|
- a generator object `data` modeling an infinite stream of integers
|
|
- a function `make_finite_stream()` that creates finite streams of data
|
|
|
|
The probability distribution underlying the integers is Gaussian-like with a
|
|
mean of 42 and a standard deviation of 8. The left tail of the distribution is
|
|
cut off meaning that the streams only produce non-negative numbers. Further,
|
|
one in a hundred random numbers has an increased chance to be an outlier.
|
|
"""
|
|
|
|
import itertools as _itertools
|
|
import random as _random
|
|
|
|
|
|
_random.seed(87)
|
|
|
|
|
|
def _infinite_stream():
|
|
"""Internal generator function to simulate an infinite stream of data."""
|
|
while True:
|
|
number = max(0, int(_random.gauss(42, 8)))
|
|
if _random.randint(1, 100) == 1:
|
|
number *= 2
|
|
yield number
|
|
|
|
|
|
def make_finite_stream(min_=5, max_=15):
|
|
"""Simulate a finite stream of data.
|
|
|
|
The returned stream is finite, but the number of elements to be produced
|
|
by it is still random. This default behavior may be turned off by passing
|
|
in `min_` and `max_` arguments with `min_ == max_`.
|
|
|
|
Args:
|
|
min_ (optional, int): minimum numbers in the stream; defaults to 5
|
|
max_ (optional, int): maximum numbers in the stream; defaults to 15
|
|
|
|
Returns:
|
|
finite_stream (generator)
|
|
|
|
Raises:
|
|
ValueError: if max_ < min_
|
|
"""
|
|
stream = _infinite_stream()
|
|
n = _random.randint(min_, max_)
|
|
yield from _itertools.islice(stream, n)
|
|
|
|
|
|
data = _infinite_stream()
|