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

回答編集履歴

3

Figure5 の変数を変更

2021/11/12 12:45

投稿

KOZ6.0
KOZ6.0

スコア2736

answer CHANGED
@@ -108,14 +108,14 @@
108
108
  int count = end - start + 1;
109
109
  int?[] numbers = new int?[count];
110
110
  Random random = new Random();
111
- for (int i = start; i <= end; i++)
111
+ for (int number = start; number <= end; number++)
112
112
  {
113
113
  int index = random.Next(0, count);
114
114
  while (numbers[index].HasValue)
115
115
  {
116
116
  index = random.Next(0, count);
117
117
  }
118
- numbers[index] = i;
118
+ numbers[index] = number;
119
119
  }
120
120
  return (from n in numbers select n.Value).ToArray();
121
121
  }

2

Figure3/4/5 を追記

2021/11/12 12:45

投稿

KOZ6.0
KOZ6.0

スコア2736

answer CHANGED
@@ -48,4 +48,76 @@
48
48
  Console.ReadKey();
49
49
  }
50
50
  }
51
+ ```
52
+
53
+ #追記
54
+ なんだかフルボッコで気の毒なので、qqfsdfsafd さんの提案するロジックも書いてみました。
55
+ (Figure4/Figure5)
56
+ 無駄は多いですが、一応、動くようです。
57
+ Figure3 は、おそらく質問者さんが実装しようとしてできなかったと思われるロジックです。
58
+
59
+ ```C#
60
+ using System;
61
+ using System.Collections.Generic;
62
+ using System.Linq;
63
+
64
+ partial class Program
65
+ {
66
+ // 重複しない値が発生するまで乱数生成を繰り返す
67
+ static int[] Figure3(int start, int end)
68
+ {
69
+ int count = end - start + 1;
70
+ HashSet<int> numbers = new HashSet<int>();
71
+ Random random = new Random();
72
+ int max = end + 1;
73
+ for (int i = 0; i < count; i++)
74
+ {
75
+ int number = random.Next(start, max);
76
+ while (numbers.Contains(number))
77
+ {
78
+ number = random.Next(start, max);
79
+ }
80
+ numbers.Add(number);
81
+ }
82
+ return numbers.ToArray();
83
+ }
84
+
85
+ // 二重ループにして重複したらプラス1
86
+ static int[] Figure4(int start, int end)
87
+ {
88
+ int count = end - start + 1;
89
+ HashSet<int> numbers = new HashSet<int>();
90
+ Random random = new Random();
91
+ int max = end + 1;
92
+ for (int i = 0; i < count; i++)
93
+ {
94
+ int number = random.Next(start, max);
95
+ while (numbers.Contains(number))
96
+ {
97
+ number++;
98
+ }
99
+ numbers.Add(number);
100
+ max--;
101
+ }
102
+ return numbers.ToArray();
103
+ }
104
+
105
+ // 空きのインデックスの内の○番目に当たるところを次々埋めていく
106
+ static int[] Figure5(int start, int end)
107
+ {
108
+ int count = end - start + 1;
109
+ int?[] numbers = new int?[count];
110
+ Random random = new Random();
111
+ for (int i = start; i <= end; i++)
112
+ {
113
+ int index = random.Next(0, count);
114
+ while (numbers[index].HasValue)
115
+ {
116
+ index = random.Next(0, count);
117
+ }
118
+ numbers[index] = i;
119
+ }
120
+ return (from n in numbers select n.Value).ToArray();
121
+ }
122
+ }
51
123
  ```

1

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

2021/11/12 10:03

投稿

KOZ6.0
KOZ6.0

スコア2736

answer CHANGED
@@ -35,7 +35,7 @@
35
35
  // LinQ
36
36
  static int[] Figure2(int start, int end)
37
37
  {
38
- int[] temp = (from n in Enumerable.Range(start, end) select n).ToArray();
38
+ int[] temp = Enumerable.Range(start, end).ToArray();
39
39
  return temp.OrderBy(a => Guid.NewGuid()).ToArray();
40
40
  }
41
41