回答編集履歴
13
テキスト修正
test
CHANGED
@@ -86,15 +86,15 @@
|
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
-
上記の回答コードでは、配列全体をlodashの [_.shuffle](https://lodash.com/docs/#shuffle) を使ってシャッフルし、シャッフルされた配列の先頭から順次、要素を取得するためにジェネレーターを使いましたが、これらを使わずに、ご質問のコードにあるように、配列`ary` の要素の中からランダムな1つを
|
89
|
+
上記の回答コードでは、配列全体をlodashの [_.shuffle](https://lodash.com/docs/#shuffle) を使ってシャッフルし、シャッフルされた配列の先頭から順次、要素を取得するためにジェネレーターを使いましたが、これらを使わずに、ご質問のコードにあるように、配列`ary` の要素の中からランダムな1つを
|
90
90
|
|
91
91
|
```javascript
|
92
92
|
|
93
|
-
Math.floor(Math.random() * ary.length)
|
93
|
+
ary[Math.floor(Math.random() * ary.length)]
|
94
94
|
|
95
95
|
```
|
96
96
|
|
97
|
-
によって
|
97
|
+
によって得ることを使ったコードを、以下に挙げます。
|
98
98
|
|
99
99
|
|
100
100
|
|
12
テキスト修正
test
CHANGED
@@ -86,19 +86,19 @@
|
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
-
上記の回答コードでは、配列全体をlodashを使ってシャッフルし、シャッフルされた配列の先頭から順次、要素を取得するためにジェネレーターを使いましたが、これらを使わずに、ご質問のコードにあるように、配列`ary` の要素の中からランダムな1つを得るために
|
89
|
+
上記の回答コードでは、配列全体をlodashの [_.shuffle](https://lodash.com/docs/#shuffle) を使ってシャッフルし、シャッフルされた配列の先頭から順次、要素を取得するためにジェネレーターを使いましたが、これらを使わずに、ご質問のコードにあるように、配列`ary` の要素の中からランダムな1つを得るために、
|
90
90
|
|
91
|
-
```
|
91
|
+
```javascript
|
92
92
|
|
93
93
|
Math.floor(Math.random() * ary.length)
|
94
94
|
|
95
95
|
```
|
96
96
|
|
97
|
-
|
97
|
+
によって、インデクスを発生させるコードを以下に挙げます。
|
98
98
|
|
99
99
|
|
100
100
|
|
101
|
-
```
|
101
|
+
```javascript
|
102
102
|
|
103
103
|
// 与えられた配列の要素を、同じ要素は返さないようにランダムに取得する関数を返す(高階)関数
|
104
104
|
|
11
テキスト修正
test
CHANGED
@@ -152,7 +152,7 @@
|
|
152
152
|
|
153
153
|
|
154
154
|
|
155
|
-
上記のようにすると、 `nextComb` には関数が入ってきます。 `nextComb()` が返すのはオブジェクトで、先のジェネレータと同様に、まだ要素がある場合は、 `value` プロパティに次の要素が入り、要素がない場合は、 `done`プロパティに `true` が入ってくるようにしています。`randomNextMaker` の返す関数の中では、ひとつ要素を返すごとに、その要素を元の配列から削除して、次
|
155
|
+
上記のようにすると、 `nextComb` には関数が入ってきます。 `nextComb()` が返すのはオブジェクトで、先のジェネレータと同様に、まだ要素がある場合は、 `value` プロパティに次の要素が入り、要素がない場合は、 `done`プロパティに `true` が入ってくるようにしています。`randomNextMaker` の返す関数の中では、ひとつ要素を返すごとに、その要素を元の配列から削除して、次に返される要素の候補から外されるようにしています。
|
156
156
|
|
157
157
|
|
158
158
|
|
10
テキスト修正
test
CHANGED
@@ -100,7 +100,7 @@
|
|
100
100
|
|
101
101
|
```
|
102
102
|
|
103
|
-
// 与えられた配列の要素を、同じ要素は返さないようにランダムに取得する関数を返す関数
|
103
|
+
// 与えられた配列の要素を、同じ要素は返さないようにランダムに取得する関数を返す(高階)関数
|
104
104
|
|
105
105
|
const randomNextMaker = (ary) => {
|
106
106
|
|
9
テキスト修正
test
CHANGED
@@ -152,7 +152,7 @@
|
|
152
152
|
|
153
153
|
|
154
154
|
|
155
|
-
上記のようにすると、 `nextComb` には関数が入ってきます。 `nextComb()` が返すのはオブジェクトで、先のジェネレータと同様に、まだ要素がある場合は、 `value` プロパティに次の要素が入
|
155
|
+
上記のようにすると、 `nextComb` には関数が入ってきます。 `nextComb()` が返すのはオブジェクトで、先のジェネレータと同様に、まだ要素がある場合は、 `value` プロパティに次の要素が入り、要素がない場合は、 `done`プロパティに `true` が入ってくるようにしています。`randomNextMaker` の返す関数の中では、ひとつ要素を返すごとに、その要素を元の配列から削除して、次の要素を返すときの候補から外されるようにしています。
|
156
156
|
|
157
157
|
|
158
158
|
|
8
テキスト修正
test
CHANGED
@@ -86,7 +86,7 @@
|
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
-
上記の回答コードでは、配列全体をlodashを使ってシャッフルし、
|
89
|
+
上記の回答コードでは、配列全体をlodashを使ってシャッフルし、シャッフルされた配列の先頭から順次、要素を取得するためにジェネレーターを使いましたが、これらを使わずに、ご質問のコードにあるように、配列`ary` の要素の中からランダムな1つを得るために
|
90
90
|
|
91
91
|
```
|
92
92
|
|
7
テキスト修正
test
CHANGED
@@ -79,3 +79,85 @@
|
|
79
79
|
|
80
80
|
|
81
81
|
以上、参考になれば幸いです。
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
### 追記
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
上記の回答コードでは、配列全体をlodashを使ってシャッフルし、それの先頭からの要素の取得にジェネレーターを使いましたが、これらを使わずに、ご質問のコードにあるように、配列`ary` の要素の中からランダムな1つを得るために
|
90
|
+
|
91
|
+
```
|
92
|
+
|
93
|
+
Math.floor(Math.random() * ary.length)
|
94
|
+
|
95
|
+
```
|
96
|
+
|
97
|
+
というインデクスを使うコードを以下に挙げます。
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
```
|
102
|
+
|
103
|
+
// 与えられた配列の要素を、同じ要素は返さないようにランダムに取得する関数を返す関数
|
104
|
+
|
105
|
+
const randomNextMaker = (ary) => {
|
106
|
+
|
107
|
+
// 引数のary のコピーを作成
|
108
|
+
|
109
|
+
ary = [...ary];
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
return () => {
|
114
|
+
|
115
|
+
// 配列が空になっている場合
|
116
|
+
|
117
|
+
if (ary.length === 0) return { done: true };
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
// 0以上 ary.length-1以下の整数を取得
|
122
|
+
|
123
|
+
const randomIndex = Math.floor(Math.random() * ary.length);
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
// 返却すべき要素を取得
|
128
|
+
|
129
|
+
const value = ary[randomIndex];
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
// randomIndexの位置の要素を除去
|
134
|
+
|
135
|
+
ary.splice(randomIndex, 1);
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
return { value, done: false }
|
140
|
+
|
141
|
+
}
|
142
|
+
|
143
|
+
}
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
// movieComb の重複無しランダム取得関数を得る。
|
148
|
+
|
149
|
+
const nextComb = randomNextMaker(movieComb);
|
150
|
+
|
151
|
+
```
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
上記のようにすると、 `nextComb` には関数が入ってきます。 `nextComb()` が返すのはオブジェクトで、先のジェネレータと同様に、まだ要素がある場合は、 `value` プロパティに次の要素が入ってきます。もう要素がない場合は、 `done`プロパティに `true` が入ってくるようにしています。`randomNextMaker` の返す関数の中では、ひとつ要素を返すごとに、その要素を元の配列から削除して、次の要素を返すときの候補から外されるようにしています。
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
上記を使ったコード例を以下のCodePen に作成しました。
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
- **動作確認用サンプル:** [https://codepen.io/jun68ykt/pen/vYYYjqP](https://codepen.io/jun68ykt/pen/vYYYjqP)
|
6
テキスト修正
test
CHANGED
@@ -34,11 +34,11 @@
|
|
34
34
|
|
35
35
|
|
36
36
|
|
37
|
-
までで作成した `movieComb` をシャッフル(ランダムに入れ替え)し
|
37
|
+
までで作成した `movieComb` をシャッフル(要素の順番をランダムに入れ替え)した配列を作り、これの先頭要素から順に返していき、最後の要素を返したら、次からはもう返す要素がないことを示す何らかの値を返すような仕組みを作ればよいです。
|
38
38
|
|
39
39
|
|
40
40
|
|
41
|
-
|
41
|
+
そのような仕組みを実現する具体的なコードは色々な書き方ができそうですが、なるべく自分でコードを書かないで済ませる方法として、[ジェネレーター](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Iterators_and_Generators)を使う手があります。上記のコードで作成された `movieComb` をシャッフルした配列を、再度 `movieComb` に代入した後で、
|
42
42
|
|
43
43
|
|
44
44
|
|
@@ -50,7 +50,7 @@
|
|
50
50
|
|
51
51
|
|
52
52
|
|
53
|
-
とすれば、 `combGenerator.next()` が返すオブジェクトの `value`プロパティに
|
53
|
+
とすれば、 `combGenerator.next()` が返すオブジェクトの `value`プロパティに要素(長さ2の配列)が入っており、もう返す要素がない場合は、`done` プロパティがtrue になります。
|
54
54
|
|
55
55
|
|
56
56
|
|
5
テキスト修正
test
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
こんにちは
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
ご質問に挙げられているコードの以下の部分
|
2
6
|
|
3
7
|
|
4
8
|
|
@@ -27,6 +31,8 @@
|
|
27
31
|
}
|
28
32
|
|
29
33
|
```
|
34
|
+
|
35
|
+
|
30
36
|
|
31
37
|
までで作成した `movieComb` をシャッフル(ランダムに入れ替え)して、「次の組み合わせを取得する」という要求に対して、シャッフルされた`movieComb` の先頭から順に返していき、かつ、もう最後まで返したので、次に返せるものはないという場合に、それが分かるような値を返させる仕組みを用意すればよいです。
|
32
38
|
|
4
テキスト修正
test
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
|
29
29
|
```
|
30
30
|
|
31
|
-
までで作成した `movieComb` をシャッフル(ランダムに入れ替え)して、「次の組み合わせを取得する」という要求に対して、
|
31
|
+
までで作成した `movieComb` をシャッフル(ランダムに入れ替え)して、「次の組み合わせを取得する」という要求に対して、シャッフルされた`movieComb` の先頭から順に返していき、かつ、もう最後まで返したので、次に返せるものはないという場合に、それが分かるような値を返させる仕組みを用意すればよいです。
|
32
32
|
|
33
33
|
|
34
34
|
|
3
テキスト修正
test
CHANGED
@@ -66,7 +66,7 @@
|
|
66
66
|
|
67
67
|
- クリック回数が 43 回目のときには、表示する組み合わせはもう無いので、その旨をアラートで表示します。
|
68
68
|
|
69
|
-
- シャッフル
|
69
|
+
- 配列をシャッフルするために lodash の [_.shuffle](https://lodash.com/docs/#shuffle) を使用しています。
|
70
70
|
|
71
71
|
|
72
72
|
|
2
テキスト修正
test
CHANGED
@@ -48,7 +48,7 @@
|
|
48
48
|
|
49
49
|
|
50
50
|
|
51
|
-
以下
|
51
|
+
以下、これを使ったコード例を CodePen に作成しました。
|
52
52
|
|
53
53
|
|
54
54
|
|
1
テキスト修正
test
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
|
34
34
|
|
35
|
-
このような仕組みを実現するコードは、色々な書き方ができそうですが、一例として[ジェネレーター](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Iterators_and_Generators)を使うという手があります。上記で作成された `movieComb` を
|
35
|
+
このような仕組みを実現するコードは、色々な書き方ができそうですが、一例として[ジェネレーター](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Iterators_and_Generators)を使うという手があります。上記で作成された `movieComb` をシャッフルした配列を、再度 `movieComb` に代入した後で、
|
36
36
|
|
37
37
|
|
38
38
|
|