回答編集履歴
3
微修正
answer
CHANGED
@@ -11,7 +11,6 @@
|
|
11
11
|
#include <iostream>
|
12
12
|
#include <set>
|
13
13
|
#include <random>
|
14
|
-
#include <algorithm>
|
15
14
|
|
16
15
|
std::set<int> random_sample(int m, int n) {
|
17
16
|
if ( m == 0 ) {
|
2
追記
answer
CHANGED
@@ -4,4 +4,41 @@
|
|
4
4
|
|
5
5
|
...だから S には m個の 1~n が重複なく現れる。
|
6
6
|
|
7
|
-
[追記] **とんでもなく勘違いしてました。そっと閉じてください** orz
|
7
|
+
[追記] **とんでもなく勘違いしてました。そっと閉じてください** orz
|
8
|
+
|
9
|
+
で、書いてみた.
|
10
|
+
```C++
|
11
|
+
#include <iostream>
|
12
|
+
#include <set>
|
13
|
+
#include <random>
|
14
|
+
#include <algorithm>
|
15
|
+
|
16
|
+
std::set<int> random_sample(int m, int n) {
|
17
|
+
if ( m == 0 ) {
|
18
|
+
return std::set<int>();
|
19
|
+
} else {
|
20
|
+
std::set<int> S = random_sample(m-1, n-1);
|
21
|
+
std::random_device rnd;
|
22
|
+
std::uniform_int_distribution<> dist(1,n);
|
23
|
+
int i = dist(rnd);
|
24
|
+
if ( S.find(i) != S.end() ) {
|
25
|
+
S.insert(n);
|
26
|
+
} else {
|
27
|
+
S.insert(i);
|
28
|
+
}
|
29
|
+
return S;
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
int main() {
|
34
|
+
int hist[10];
|
35
|
+
std::fill_n(hist, 10, 0);
|
36
|
+
for ( int i = 0; i < 10000; ++i ) {
|
37
|
+
for ( int item : random_sample(3, 10)) { ++hist[item-1]; }
|
38
|
+
}
|
39
|
+
for ( int item : hist ) {
|
40
|
+
std::cout << item << ' ';
|
41
|
+
}
|
42
|
+
std::cout << std::endl;
|
43
|
+
}
|
44
|
+
```
|
1
追記
answer
CHANGED
@@ -2,4 +2,6 @@
|
|
2
2
|
2. i = RANDOM(1, n) が既に S に含まれていたら n を追加する。(1.より重複しない)
|
3
3
|
3. i が S に含まれていないなら i を追加する。(当然重複しない)
|
4
4
|
|
5
|
-
...だから S には m個の 1~n が重複なく現れる。
|
5
|
+
...だから S には m個の 1~n が重複なく現れる。
|
6
|
+
|
7
|
+
[追記] **とんでもなく勘違いしてました。そっと閉じてください** orz
|