5
5
#include < random>
6
6
#include " Complex.hpp"
7
7
8
- using namespace std ;
9
-
10
8
template <typename T>
11
9
struct Generator {
12
10
T m_value, m_step;
@@ -29,17 +27,28 @@ void compute(int len, T initial, T step) {
29
27
std::vector<T> v (len+1 ), diffs (len+1 );
30
28
31
29
// fill and randomize v
32
- generate (v.begin (), v.end (), Generator<T>(initial, step));
33
- shuffle (v.begin (), v.end (), std::default_random_engine{});
30
+ std::generate (v.begin (), v.end (), Generator<T>(initial, step));
31
+ // Alternatively:
32
+ // std::generate(v.begin(), v.end(), [value = initial, step]() mutable {
33
+ // const T cur = value;
34
+ // value += step;
35
+ // return cur;
36
+ // });
34
37
35
- // compute differences
36
- adjacent_difference (v.begin (), v.end (), diffs.begin ());
38
+ std::shuffle (v.begin (), v.end (), std::default_random_engine{});
37
39
38
- // compute standard deviation of it
39
- T sum = reduce (diffs.begin ()+1 , diffs.end (), T ());
40
- T sumsq = reduce (diffs.begin ()+1 , diffs.end (), T (), sumsquare<T>());
41
- T mean = sum/len;
42
- T variance = sumsq/len - mean*mean;
40
+ // compute differences
41
+ std::adjacent_difference (v.begin (), v.end (), diffs.begin ());
42
+
43
+ // compute standard deviation of all differences.
44
+ // Note that the first element is just the original element itself, so we need to skip it.
45
+ const T sum = std::reduce (diffs.begin ()+1 , diffs.end (), T ());
46
+ const T sumsq = std::reduce (diffs.begin ()+1 , diffs.end (), T (), sumsquare<T>());
47
+ // Alternatively:
48
+ // const T sumsq = std::reduce(diffs.begin()+1, diffs.end(), T(),
49
+ // [](const T& s, const T& a) { return s + a * a; });
50
+ const T mean = sum/len;
51
+ const T variance = sumsq/len - mean*mean;
43
52
44
53
std::cout << " Range = [" << initial << " , " << step*len << " ]\n "
45
54
<< " Mean = " << mean << ' \n '
0 commit comments