回答編集履歴

3

更に追記

2016/12/23 05:29

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -171,3 +171,111 @@
171
171
  tTypeが整数(integral)の時後者のRandomクラス、それ以外の時前者のRandomクラスが実体化されます。
172
172
 
173
173
 
174
+
175
+ ---
176
+
177
+ 【michiru_cppさんのアイデアを貰って修正】
178
+
179
+
180
+
181
+ ```C++
182
+
183
+ # include <iostream>
184
+
185
+ # include <random>
186
+
187
+ # include <type_traits>
188
+
189
+ # include <ctime>
190
+
191
+
192
+
193
+ template<typename tType>
194
+
195
+ class Random
196
+
197
+ {
198
+
199
+ std::default_random_engine mEngine;
200
+
201
+ typename
202
+
203
+ std::conditional
204
+
205
+ <
206
+
207
+ std::is_integral<tType>::value,
208
+
209
+ std::uniform_int_distribution<tType>,
210
+
211
+ std::uniform_real_distribution<tType>
212
+
213
+ >::type mDistribution;
214
+
215
+ public:
216
+
217
+ Random(tType iMin, tType iMax) :
218
+
219
+ mEngine(time(nullptr)),
220
+
221
+ mDistribution(iMin, iMax)
222
+
223
+ { }
224
+
225
+
226
+
227
+ tType operator()()
228
+
229
+ {
230
+
231
+ return mDistribution(mEngine);
232
+
233
+ }
234
+
235
+ };
236
+
237
+
238
+
239
+ int main()
240
+
241
+ {
242
+
243
+ Random<int> aRandomInt(0, 4);
244
+
245
+ for(int i=0; i < 10; ++i)
246
+
247
+ {
248
+
249
+ std::cout << aRandomInt() << '\n';
250
+
251
+ }
252
+
253
+
254
+
255
+ Random<double> aRandomDouble(0, 4);
256
+
257
+ for(int i=0; i < 10; ++i)
258
+
259
+ {
260
+
261
+ std::cout << aRandomDouble() << '\n';
262
+
263
+ }
264
+
265
+
266
+
267
+ return 0;
268
+
269
+ }
270
+
271
+ ```
272
+
273
+
274
+
275
+ よし、同じことを2回書かずにできました。
276
+
277
+ なるほどstd::conditional<>強力です。
278
+
279
+
280
+
281
+ BeatStarさん。質問の主旨から外してしまってすいません。

2

追記

2016/12/23 05:29

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -37,3 +37,137 @@
37
37
  スマートに書くには意外にC++11の機能を使いまくることになりそうですが。
38
38
 
39
39
  後でサンプルを書いてみるかも知れません。(期待はしないで下さい。)
40
+
41
+
42
+
43
+ ---
44
+
45
+ 【追記】
46
+
47
+ サンプル作ってみました。
48
+
49
+ でもすいません。「型だけが異なるものを作る時はテンプレートを活用するとよいです」の効果が見える姿にできませんでした。
50
+
51
+ uniform_real_distribution<>とuniform_int_distribution<>を分岐させるために結局2つほぼ同じものを定義すると言うおまぬけです。コンパイル時処理になるのでそこそこ軽くはなっている筈ですが。
52
+
53
+
54
+
55
+ ```C++
56
+
57
+ # include <iostream>
58
+
59
+ # include <random>
60
+
61
+ # include <type_traits>
62
+
63
+ # include <ctime>
64
+
65
+
66
+
67
+ template<typename tType, class tEnable=void>
68
+
69
+ class Random
70
+
71
+ {
72
+
73
+ std::default_random_engine mEngine;
74
+
75
+ std::uniform_real_distribution<tType> mDistribution;
76
+
77
+ public:
78
+
79
+ Random(tType iMin, tType iMax) :
80
+
81
+ mEngine(time(nullptr)),
82
+
83
+ mDistribution(iMin, iMax)
84
+
85
+ { }
86
+
87
+
88
+
89
+ tType operator()()
90
+
91
+ {
92
+
93
+ return mDistribution(mEngine);
94
+
95
+ }
96
+
97
+ };
98
+
99
+
100
+
101
+ template<typename tType>
102
+
103
+ class Random<tType, typename std::enable_if<std::is_integral<tType>::value>::type>
104
+
105
+ {
106
+
107
+ std::default_random_engine mEngine;
108
+
109
+ std::uniform_int_distribution<tType> mDistribution;
110
+
111
+ public:
112
+
113
+ Random(tType iMin, tType iMax) :
114
+
115
+ mEngine(time(nullptr)),
116
+
117
+ mDistribution(iMin, iMax)
118
+
119
+ { }
120
+
121
+
122
+
123
+ tType operator()()
124
+
125
+ {
126
+
127
+ return mDistribution(mEngine);
128
+
129
+ }
130
+
131
+ };
132
+
133
+
134
+
135
+ int main()
136
+
137
+ {
138
+
139
+ Random<int> aRandomInt(0, 4);
140
+
141
+ for(int i=0; i < 10; ++i)
142
+
143
+ {
144
+
145
+ std::cout << aRandomInt() << '\n';
146
+
147
+ }
148
+
149
+
150
+
151
+ Random<double> aRandomDouble(0, 4);
152
+
153
+ for(int i=0; i < 10; ++i)
154
+
155
+ {
156
+
157
+ std::cout << aRandomDouble() << '\n';
158
+
159
+ }
160
+
161
+
162
+
163
+ return 0;
164
+
165
+ }
166
+
167
+ ```
168
+
169
+
170
+
171
+ tTypeが整数(integral)の時後者のRandomクラス、それ以外の時前者のRandomクラスが実体化されます。
172
+
173
+

1

補足

2016/12/23 03:43

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -5,6 +5,12 @@
5
5
  原因は、MinGWの実装が期待と異なることですね。
6
6
 
7
7
  「cpprefjp - C++日本語リファレンス」に記載されている「実装の制限によって予測不能な乱数生成器を定義できない場合、このクラスは擬似乱数生成器で定義される可能性がある。」にMinGWは残念ながら該当するようです。
8
+
9
+
10
+
11
+ [C++ MinGWを使用した場合にstd::random_deviceが毎回同じ値を出力する問題について](http://qiita.com/mekamikan/items/f9a15e4e96975380c1bf)
12
+
13
+ [Why do I get the same sequence for every run with std::random_device with mingw gcc4.8.1?](http://stackoverflow.com/questions/18880654/why-do-i-get-the-same-sequence-for-every-run-with-stdrandom-device-with-mingw)
8
14
 
9
15
 
10
16