229
|
1 #include <stdio.h>
|
|
2 #include <stdlib.h>
|
230
|
3 #include <sys/time.h>
|
229
|
4 #include "Random.h"
|
370
|
5 #define HAS_SRANDOMDEV 1
|
229
|
6
|
|
7 /**
|
230
|
8 * /dev/urandom, random から取得した値を seed として使う
|
229
|
9 */
|
|
10 Random::Random(void)
|
|
11 {
|
230
|
12 reset();
|
229
|
13 }
|
|
14
|
|
15 /**
|
|
16 * 引数で seed を指定する
|
|
17 */
|
|
18 Random::Random(unsigned int seed)
|
|
19 {
|
|
20 srandom(seed);
|
|
21 }
|
|
22
|
230
|
23 void
|
|
24 Random::reset(void)
|
|
25 {
|
370
|
26 #if HAS_SRANDOMDEV
|
230
|
27 FILE *fp;
|
|
28 unsigned int seed;
|
|
29 struct timeval tv;
|
|
30
|
|
31 fp = fopen("/dev/urandom", "r");
|
|
32 if (!fp) fp = fopen("/dev/random", "r");
|
|
33
|
|
34 if (fp) {
|
|
35 int res = fread(&seed, sizeof(unsigned int), 1, fp);
|
|
36 if (res != sizeof(unsigned int)) {
|
|
37 fclose(fp);
|
|
38 fp = NULL;
|
|
39 }
|
|
40 }
|
|
41
|
|
42 if (!fp) {
|
|
43 gettimeofday(&tv, NULL);
|
|
44 seed = (tv.tv_sec ^ tv.tv_usec);
|
|
45 } else {
|
|
46 fclose(fp);
|
|
47 }
|
|
48
|
|
49 srandom(seed);
|
370
|
50 #else
|
|
51 srandomdev();
|
|
52 #endif
|
230
|
53 }
|
|
54
|
370
|
55 /*!
|
|
56 1 から 2^(32-1) のランダムな数値を返す。
|
|
57 */
|
|
58
|
229
|
59 int
|
|
60 Random::getData(void)
|
|
61 {
|
|
62 return random();
|
|
63 }
|