Iterator library for lazy calculation and parallel access of counter-based random numbers.
Iterator library for lazy calculation and parallel access of counter-based random numbers.
=======
Table of Contents
=================
*[What is it?](#what-is-it)
*[Main features](#main-features)
*[The Latest Version](#the-latest-version)
*[Documentation](#documentation)
*[Reference manual](#reference-manual)
*[Users guide](#users-guide)
*[Installation and requirements](#installation-and-requirements)
*[Examples](#examples)
*[Licensing](#licensing)
*[Contact the developers](#contact-the-developers)
*[Author](#author)
*[Acknowledgement](#acknowledgement)
--------------------------------------
## What is it?
RandomIterator is a small library providing iterators pointing to streams of pseudorandom numbers.
The library deploys lazy-evaluation and is intented for usage on multi-thread calculations.
## Main features
1. Five primary generators: Philox, ARS and Threefry from [Random123](https://ieeexplore.ieee.org/abstract/document/6114424) and Squares3 and Squares4, which are natively implemented.
2. Completly thread-safe.
3. Compatibility with all C++ distributions defined in the standard library.
4. For each seed, the ```random_iterator::Stream<Distribution, Engine>``` manages up to $`{2}^{32}`$ streams, with length $`{2}^{64}`$.
5. When instantiated to produce 64bit output, like ```double``` ou ```uint64_t```, each stream can provide up to 128EB of data.
## The Latest Version
Documentation
-------------
### Reference manual
The complete and updated [Doxygen](http://www.doxygen.org/) source code documentation in HTML format is available at the
[Reference documentation]() web-page.
It is also possible to browse the documentation by class, file or name using the links:
1.[classes]()
2.[files]()
3.[names]()
### Examples:
```
#include <random_iterator/Stream.hpp>
#include <random>
#include <iostream>
...
//generator
random_iterator::philox RNG(0x548c9decbce65295);
//std distribution
std::uniform_real_distribution<double>
uniform_dist(0.0, 1.0);
//streams
auto uniform_stream = random_iterator::make_stream( uniform_dist, RNG, 0);
//using range semantics
for(auto unf : uniform_stream)
std::cout << unf << std::endl;
//using subscript operator
for(size_t i=0; i < 100; ++i)
std::cout << uniform_stream[i] << std::endl;
...
```
## Installation and requirements
RandomIterator iterator is a header-only library with no dependences.
## Licensing
RandomIterator is released under the GNU General Public License version 3. Please see the file called LICENSE.
## Contacting the developers
Here’s what you should do if you need help or would like to contribute:
* If you found a bug or what to ask any question, use GitLab issues.
* If you have an idea, suggestion or whatever, use GitHub issues.
* If you want to contribute, submit a pull request.
## Acknowledgement
The authors acknowledge support by the High Performance and Cloud Computing Group
at the Zentrum für Datenverarbeitung of the University of Tübingen, the state of Baden-
Württemberg through bwHPC and the German Research Foundation (DFG) through grant