回答編集履歴

1

サンプルコードを追加

2016/03/03 14:06

投稿

raccy
raccy

スコア21733

test CHANGED
@@ -1 +1,87 @@
1
1
  10個の要素から3個を取り出すでいいのですよね?それなら、[std::shuffle](http://cpprefjp.github.io/reference/algorithm/shuffle.html)を使ってランダムに並び替えして、最初の3個を取るのが実装が一番簡単だと思います。(ただし、最速ではありません)
2
+
3
+
4
+
5
+ 参考までに作りました。C++11で作成していますので、clang++でコンパイルするときは"-std=c++11"や"-std=c++14"を付けて下さい。
6
+
7
+ ```C++
8
+
9
+ #include <algorithm>
10
+
11
+ #include <iostream>
12
+
13
+ #include <random>
14
+
15
+ #include <string>
16
+
17
+ #include <vector>
18
+
19
+
20
+
21
+ int main()
22
+
23
+ {
24
+
25
+ // シード値には非決定的な random_device を用います。
26
+
27
+ // random_device は極めて低速ですが、予測は不可能な乱数です。
28
+
29
+ std::random_device seed;
30
+
31
+ // 乱数には優秀なメルセンヌツイスター mt19937 を用います。
32
+
33
+ // C++11以上では、特殊な事情が無い限り、メルセンヌツイスターを
34
+
35
+ // 使用して下さい。
36
+
37
+ std::mt19937 engine(seed());
38
+
39
+
40
+
41
+ // 文字列は string を、リストは vector を用います。
42
+
43
+ // C++11 からは初期化子リストが使えます。
44
+
45
+ std::vector<std::string> moji = {"moji-retsu0", "moji-retsu1",
46
+
47
+ "moji-retsu2", "moji-retsu3", "moji-retsu4",
48
+
49
+ "moji-retsu5", "moji-retsu6", "moji-retsu7",
50
+
51
+ "moji-retsu8", "moji-retsu9"};
52
+
53
+
54
+
55
+ // 一様な分布は uniform_int_distribution を使います。
56
+
57
+ std::uniform_int_distribution<int> dist(0, moji.size() - 1);
58
+
59
+
60
+
61
+ // あとは dist(engine) で 1 から mojiにある個数-1 までの乱数を求めて、
62
+
63
+ // その位置にある要素を取り出します。
64
+
65
+ std::cout << moji.at(dist(engine)) << "x" << moji.at(dist(engine))
66
+
67
+ << "x" << moji.at(dist(engine)) << std::endl;
68
+
69
+
70
+
71
+ // 重複したくない場合は、リストを shuffle します。
72
+
73
+ std::shuffle(moji.begin(), moji.end(), engine);
74
+
75
+ // はじめの三つだけ取り出します。
76
+
77
+ std::cout << moji.at(0) << "x" << moji.at(1) << "x" << moji.at(2)
78
+
79
+ << std::endl;
80
+
81
+
82
+
83
+ return 0;
84
+
85
+ }
86
+
87
+ ```