回答編集履歴

13

テキスト修正

2019/10/06 14:51

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/10/06 14:51

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/10/06 14:34

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/10/06 13:58

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -100,7 +100,7 @@
100
100
 
101
101
  ```
102
102
 
103
- // 与えられた配列の要素を、同じ要素は返さないようにランダムに取得する関数を返す関数
103
+ // 与えられた配列の要素を、同じ要素は返さないようにランダムに取得する関数を返す(高階)関数
104
104
 
105
105
  const randomNextMaker = (ary) => {
106
106
 

9

テキスト修正

2019/10/06 13:52

投稿

jun68ykt
jun68ykt

スコア9058

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
 

8

テキスト修正

2019/10/06 13:49

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
 
88
88
 
89
- 上記の回答コードでは、配列全体をlodashを使ってシャッフルし、れの先頭から要素取得にジェネレーターを使いましたが、これらを使わずに、ご質問のコードにあるように、配列`ary` の要素の中からランダムな1つを得るために
89
+ 上記の回答コードでは、配列全体をlodashを使ってシャッフルし、シャッフルさた配列の先頭から順次、要素取得するためにジェネレーターを使いましたが、これらを使わずに、ご質問のコードにあるように、配列`ary` の要素の中からランダムな1つを得るために
90
90
 
91
91
  ```
92
92
 

7

テキスト修正

2019/10/06 13:46

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/10/06 13:03

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -34,11 +34,11 @@
34
34
 
35
35
 
36
36
 
37
- までで作成した `movieComb` をシャッフル(ランダムに入れ替え)して、「次の組み合わせ取得する」という要求に対してシャッフルさた`movieComb` の先頭から順に返していき、かつ、もう最後まで返したので、次せるものはないという場合に、それが分ような値を返させる仕組みを用意すればよいです。
37
+ までで作成した `movieComb` をシャッフル(要素の順番をランダムに入れ替え)した配列作りれの先頭要素から順に返していき、最後の要素を返した、次からはもうす要素がないを示す何らの値を返すような仕組みをればよいです。
38
38
 
39
39
 
40
40
 
41
- のような仕組みを実現するコードは色々な書き方ができそうですが、一例として[ジェネレーター](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Iterators_and_Generators)を使うという手があります。上記で作成された `movieComb` をシャッフルした配列を、再度 `movieComb` に代入した後で、
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`プロパティに組み合わせが入っており、もう返せる組み合わせがない場合は、`done` プロパティがtrue になります。
53
+ とすれば、 `combGenerator.next()` が返すオブジェクトの `value`プロパティに要素(長さ2の配列)が入っており、もう返す要素がない場合は、`done` プロパティがtrue になります。
54
54
 
55
55
 
56
56
 

5

テキスト修正

2019/10/06 11:30

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/10/06 07:20

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  ```
30
30
 
31
- までで作成した `movieComb` をシャッフル(ランダムに入れ替え)して、「次の組み合わせを取得する」という要求に対して、そのシャッフルされた`movieComb` の先頭から順に返していき、かつ、もう最後まで返したので、次に返せるものはないという場合に、それが分かるような値を返させる仕組みを用意すればよいです。
31
+ までで作成した `movieComb` をシャッフル(ランダムに入れ替え)して、「次の組み合わせを取得する」という要求に対して、シャッフルされた`movieComb` の先頭から順に返していき、かつ、もう最後まで返したので、次に返せるものはないという場合に、それが分かるような値を返させる仕組みを用意すればよいです。
32
32
 
33
33
 
34
34
 

3

テキスト修正

2019/10/06 07:02

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -66,7 +66,7 @@
66
66
 
67
67
  - クリック回数が 43 回目のときには、表示する組み合わせはもう無いので、その旨をアラートで表示します。
68
68
 
69
- - シャッフルされた`movieComb` を得るためにlodash の [_.shuffle](https://lodash.com/docs/#shuffle) を使用しています。
69
+ - 配列をシャッフルるために lodash の [_.shuffle](https://lodash.com/docs/#shuffle) を使用しています。
70
70
 
71
71
 
72
72
 

2

テキスト修正

2019/10/06 07:00

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
 
50
50
 
51
- 以下、これを使ったコード例を CodePen に作成しました。
51
+ 以下、これを使ったコード例を CodePen に作成しました。
52
52
 
53
53
 
54
54
 

1

テキスト修正

2019/10/06 06:59

投稿

jun68ykt
jun68ykt

スコア9058

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