回答編集履歴

1

追記

2019/09/11 03:34

投稿

Zuishin
Zuishin

スコア28669

test CHANGED
@@ -13,3 +13,151 @@
13
13
 
14
14
 
15
15
  その配列の先頭 10 個を取り出せば、目的の結果が得られます。
16
+
17
+
18
+
19
+ #追記
20
+
21
+
22
+
23
+ ```C#
24
+
25
+ using System;
26
+
27
+ using System.Collections.Generic;
28
+
29
+ using System.Linq;
30
+
31
+
32
+
33
+ namespace ConsoleApp1
34
+
35
+ {
36
+
37
+ class Program
38
+
39
+ {
40
+
41
+ static Random random = new Random();
42
+
43
+
44
+
45
+ static void Main(string[] args)
46
+
47
+ {
48
+
49
+ Console.WriteLine(CountDouble(ByShuffle, 100000));
50
+
51
+ Console.WriteLine(CountDouble(ByRetry, 100000));
52
+
53
+ }
54
+
55
+
56
+
57
+ static int CountDouble(Func<int[]> func, int count)
58
+
59
+ {
60
+
61
+ return Enumerable
62
+
63
+ .Repeat(0, count)
64
+
65
+ .Select(_ => CountGroup(func()).Where(a => a == 2).Count())
66
+
67
+ .Sum();
68
+
69
+ }
70
+
71
+
72
+
73
+ static IEnumerable<int> CountGroup(int[] array)
74
+
75
+ {
76
+
77
+ return array.GroupBy(a => a).Select(a => a.Count());
78
+
79
+ }
80
+
81
+
82
+
83
+ static int[] ByRetry()
84
+
85
+ {
86
+
87
+ while (true)
88
+
89
+ {
90
+
91
+ var result = Enumerable
92
+
93
+ .Repeat(0, 10)
94
+
95
+ .Select(a => random.Next(10))
96
+
97
+ .ToArray();
98
+
99
+ if (CountGroup(result).Max() < 3)
100
+
101
+ {
102
+
103
+ return result;
104
+
105
+ }
106
+
107
+ }
108
+
109
+ }
110
+
111
+
112
+
113
+ static int[] ByShuffle()
114
+
115
+ {
116
+
117
+ var buffer = new int[20];
118
+
119
+ for (int i = 0; i < 20; i++)
120
+
121
+ {
122
+
123
+ buffer[i] = i / 2;
124
+
125
+ }
126
+
127
+ for (int i = 19; i >= 1; i--)
128
+
129
+ {
130
+
131
+ int j = random.Next(20);
132
+
133
+ (buffer[i], buffer[j]) = (buffer[j], buffer[i]);
134
+
135
+ }
136
+
137
+ return buffer.Take(10).ToArray();
138
+
139
+ }
140
+
141
+ }
142
+
143
+ }
144
+
145
+ ```
146
+
147
+
148
+
149
+ 上記コードで検証したところ、10 万回行って同じ数字が 2 個あるものの組数を合計すると、以下のようになりました。
150
+
151
+
152
+
153
+ ```
154
+
155
+ シャッフル: 24 万
156
+
157
+ リトライ: 28 万
158
+
159
+ ```
160
+
161
+
162
+
163
+ シャッフルバージョンは同じ数字が含まれる確率がリトライバージョンに比べてやや低いようです。これが問題になるようであれば、リトライしてください。