teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

微修正

2020/04/30 07:44

投稿

episteme
episteme

スコア16612

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

追記

2020/04/30 07:43

投稿

episteme
episteme

スコア16612

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

追記

2020/04/30 07:20

投稿

episteme
episteme

スコア16612

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