-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathurd.cxx
More file actions
83 lines (72 loc) · 2.07 KB
/
urd.cxx
File metadata and controls
83 lines (72 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
* Copyright (c) 2015 Artur Grabowski <art@blahonga.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <random>
#include <iostream>
#include <stdio.h>
#include <assert.h>
/*
* Hey, I heard that C++11 has magic to get a uniform distribution of
* floating point numbers, let's see how it performs.
*/
int
main(int argc, char **argv)
{
std::default_random_engine gen;
double from, step, to;
int range = 3;
switch (argc) {
case 1:
from = 1.0;
break;
default:
case 3:
range = atoi(argv[2]);
case 2:
from = atof(argv[1]);
break;
}
/*
* Calculate the nearest representable number after from.
* add 1.0 to deal with from being 0 (shouldn't cause overflow
* because at that range 1.0 means nothing).
*/
step = nextafter(from, (from + 1.0) * 2.0) - from;
/*
* uniform_real_distribution should return [from,to), but they
* all return [from,to], so that's why 1 is subtracted from range.
*/
to = from + step * (range - 1);
printf("%a %a %a %d\n", from, to, step, range);
std::uniform_real_distribution<double> dis(from, to);
int bucket[range];
int i;
for (i = 0; i < range; i++) {
bucket[i] = 0;
}
for (i = 0; i < 100 * range; i++) {
double r = dis(gen);
unsigned int b = (int)((r - from)/step);
if (b >= range) {
printf("foo: %d %f\n", b, r);
}
assert(b < range);
bucket[b]++;
}
for (i = 0; i < range; i++) {
printf("%d\n", bucket[i]);
}
return 0;
}