回答編集履歴

3

Figure5 の変数を変更

2021/11/12 12:45

投稿

KOZ6.0
KOZ6.0

スコア2703

test CHANGED
@@ -218,7 +218,7 @@
218
218
 
219
219
  Random random = new Random();
220
220
 
221
- for (int i = start; i <= end; i++)
221
+ for (int number = start; number <= end; number++)
222
222
 
223
223
  {
224
224
 
@@ -232,7 +232,7 @@
232
232
 
233
233
  }
234
234
 
235
- numbers[index] = i;
235
+ numbers[index] = number;
236
236
 
237
237
  }
238
238
 

2

Figure3/4/5 を追記

2021/11/12 12:45

投稿

KOZ6.0
KOZ6.0

スコア2703

test CHANGED
@@ -99,3 +99,147 @@
99
99
  }
100
100
 
101
101
  ```
102
+
103
+
104
+
105
+ #追記
106
+
107
+ なんだかフルボッコで気の毒なので、qqfsdfsafd さんの提案するロジックも書いてみました。
108
+
109
+ (Figure4/Figure5)
110
+
111
+ 無駄は多いですが、一応、動くようです。
112
+
113
+ Figure3 は、おそらく質問者さんが実装しようとしてできなかったと思われるロジックです。
114
+
115
+
116
+
117
+ ```C#
118
+
119
+ using System;
120
+
121
+ using System.Collections.Generic;
122
+
123
+ using System.Linq;
124
+
125
+
126
+
127
+ partial class Program
128
+
129
+ {
130
+
131
+ // 重複しない値が発生するまで乱数生成を繰り返す
132
+
133
+ static int[] Figure3(int start, int end)
134
+
135
+ {
136
+
137
+ int count = end - start + 1;
138
+
139
+ HashSet<int> numbers = new HashSet<int>();
140
+
141
+ Random random = new Random();
142
+
143
+ int max = end + 1;
144
+
145
+ for (int i = 0; i < count; i++)
146
+
147
+ {
148
+
149
+ int number = random.Next(start, max);
150
+
151
+ while (numbers.Contains(number))
152
+
153
+ {
154
+
155
+ number = random.Next(start, max);
156
+
157
+ }
158
+
159
+ numbers.Add(number);
160
+
161
+ }
162
+
163
+ return numbers.ToArray();
164
+
165
+ }
166
+
167
+
168
+
169
+ // 二重ループにして重複したらプラス1
170
+
171
+ static int[] Figure4(int start, int end)
172
+
173
+ {
174
+
175
+ int count = end - start + 1;
176
+
177
+ HashSet<int> numbers = new HashSet<int>();
178
+
179
+ Random random = new Random();
180
+
181
+ int max = end + 1;
182
+
183
+ for (int i = 0; i < count; i++)
184
+
185
+ {
186
+
187
+ int number = random.Next(start, max);
188
+
189
+ while (numbers.Contains(number))
190
+
191
+ {
192
+
193
+ number++;
194
+
195
+ }
196
+
197
+ numbers.Add(number);
198
+
199
+ max--;
200
+
201
+ }
202
+
203
+ return numbers.ToArray();
204
+
205
+ }
206
+
207
+
208
+
209
+ // 空きのインデックスの内の○番目に当たるところを次々埋めていく
210
+
211
+ static int[] Figure5(int start, int end)
212
+
213
+ {
214
+
215
+ int count = end - start + 1;
216
+
217
+ int?[] numbers = new int?[count];
218
+
219
+ Random random = new Random();
220
+
221
+ for (int i = start; i <= end; i++)
222
+
223
+ {
224
+
225
+ int index = random.Next(0, count);
226
+
227
+ while (numbers[index].HasValue)
228
+
229
+ {
230
+
231
+ index = random.Next(0, count);
232
+
233
+ }
234
+
235
+ numbers[index] = i;
236
+
237
+ }
238
+
239
+ return (from n in numbers select n.Value).ToArray();
240
+
241
+ }
242
+
243
+ }
244
+
245
+ ```

1

Enumerable.Range(start, end).ToArray() で良かった

2021/11/12 10:03

投稿

KOZ6.0
KOZ6.0

スコア2703

test CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
  {
74
74
 
75
- int[] temp = (from n in Enumerable.Range(start, end) select n).ToArray();
75
+ int[] temp = Enumerable.Range(start, end).ToArray();
76
76
 
77
77
  return temp.OrderBy(a => Guid.NewGuid()).ToArray();
78
78