回答編集履歴

16

テキスト修正

2018/10/27 03:00

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -170,7 +170,7 @@
170
170
 
171
171
 
172
172
 
173
- なお、Lodash をCDNから利用する場合のURLは以下す。
173
+ なお、Lodash をCDNから利用する場合のURLは以下に記載されています。
174
174
 
175
175
 
176
176
 

15

テキスト修正

2018/10/27 03:00

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -124,7 +124,7 @@
124
124
 
125
125
 
126
126
 
127
- 配列の様々な操作が集められているライブラリ [Lodash](https://lodash.com/) に、 [shuffle](https://lodash.com/docs/4.17.10#shuffle) が用意されています。以下、これを使った例す。(なお、以下のコードは、Zuishinさんのご回答をコードにしたものの一例にもなっています。)
127
+ 与えられた配列の要素の順番をランダムに入れ替えることを、シャッフル(shuffle)といいますが、配列の様々な操作が集められているライブラリ [Lodash](https://lodash.com/) に、 [_.shuffle(collection)](https://lodash.com/docs/4.17.10#shuffle) が用意されていますので、これを使った例を示します。(なお、以下のコードは、Zuishinさんのご回答をコードにしたものの一例にもなっています。)
128
128
 
129
129
 
130
130
 

14

テキスト修正

2018/10/27 02:43

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
 
72
72
 
73
- しかし、上記だと必ず何回目かまで(あるいは、実用上耐えうる実行時間内)のループで、 `nums` に 6個の要素が詰め込まれる、とは言えず、無限ループの可能性がゼロではないです。実際は限りなくゼロに近いでしょうけれども。)ですので、以下のように、乱数の生成回数に適度に上限を設けて、それに達したら `nums`の要素が6個に満たなくてもループを抜けるようにします。
73
+ しかし、上記だと必ず何回目かまで(あるいは、実用上耐えうる実行時間内)のループで、 `nums` に 6個の要素が詰め込まれる、とは言えず、無限ループの可能性がゼロではないです。実際は限りなくゼロに近いでしょうけれども、このままにしておくのも何となく心残りですので、乱数の生成回数に適度に上限を設けて、それに達したら `nums`の要素が6個に満たなくてもループを抜けるようにします。以下そのような上限を追加したコードです。
74
74
 
75
75
 
76
76
 

13

テキスト修正

2018/10/27 02:39

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 2つ通りのやり方によるコードを回答します。ご質問に、
5
+ 通りのやり方によるコードを回答します。ご質問に、
6
6
 
7
7
 
8
8
 
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- を示し、追加でもうひとつ
19
+ を示し、追加でもうひとつ、同じお題を私がスクラッチから書くとしたらこうかな、という
20
20
 
21
21
  - (2) Lodash の shuffle を使う案
22
22
 

12

テキスト修正

2018/10/27 02:31

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- ご質問に
5
+ 2つ通りのやり方によるコードを回答します。ご質問に
6
6
 
7
7
 
8
8
 
@@ -10,17 +10,19 @@
10
10
 
11
11
 
12
12
 
13
- とありましたので、以下の2つ案
13
+ とありましたので、まず
14
+
15
+ - (1) ご質問に挙げられているコードをなるべく生かす案
14
16
 
15
17
 
16
18
 
17
- (1) ご質問に挙げられているコードなるべく生かす案
19
+ 示し、追加でもうひとつ
18
20
 
19
- (2) Lodash の shuffle を使う案
21
+ - (2) Lodash の shuffle を使う案
20
22
 
21
23
 
22
24
 
23
- 以下、順に回答します。
25
+ を以下に回答します。
24
26
 
25
27
 
26
28
 

11

テキスト修正

2018/10/27 02:27

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,66 +1,4 @@
1
1
  こんにちは。
2
-
3
-
4
-
5
- 配列の様々な操作が集められているライブラリ [Lodash](https://lodash.com/) に、 [shuffle](https://lodash.com/docs/4.17.10#shuffle) が用意されています。以下、これを使った例です。(なお、以下のコードは、Zuishinさんのご回答をコードにしたものの一例にもなっています。)
6
-
7
-
8
-
9
- ```javascript
10
-
11
- // 1 から 43 までを昇順に含む配列を作成
12
-
13
- const ary1to43 = [...Array(43)].map((_,i) => i+1);
14
-
15
-
16
-
17
- console.log(ary1to43);
18
-
19
-
20
-
21
- // シャッフルした配列を作成
22
-
23
- const shuffled1to43 = _.shuffle(ary1to43);
24
-
25
-
26
-
27
- console.log(shuffled1to43);
28
-
29
-
30
-
31
- // 先頭6個の配列を得る
32
-
33
- const result = shuffled1to43.slice(0,6);
34
-
35
-
36
-
37
- console.log(result);
38
-
39
- ```
40
-
41
-
42
-
43
- 以下、上記の動作確認用のサンプルです。
44
-
45
-
46
-
47
- - [https://jsfiddle.net/jun68ykt/5thmspbk/5/](https://jsfiddle.net/jun68ykt/5thmspbk/5/)
48
-
49
-
50
-
51
- なお、Lodash をCDNから利用する場合のURLは以下です。
52
-
53
-
54
-
55
- - **cdnjs.com:** [https://cdnjs.com/libraries/lodash.js/](https://cdnjs.com/libraries/lodash.js/)
56
-
57
-
58
-
59
- 参考になれば幸いです。
60
-
61
-
62
-
63
- #### 追記
64
2
 
65
3
 
66
4
 
@@ -72,7 +10,21 @@
72
10
 
73
11
 
74
12
 
13
+ とありましたので、以下の2つ案
14
+
15
+
16
+
17
+ (1) ご質問に挙げられているコードをなるべく生かす案
18
+
19
+ (2) Lodash の shuffle を使う案
20
+
21
+
22
+
23
+ を、以下、順に回答します。
24
+
25
+
26
+
75
- とありましたので、ご質問に挙げられているコードをなるべく生かす案を以下に追記します。
27
+ #### (1) ご質問に挙げられているコードをなるべく生かす案
76
28
 
77
29
 
78
30
 
@@ -163,3 +115,69 @@
163
115
 
164
116
 
165
117
  上記のコードの意図は、「1から43までの数から無作為に一個取ることを、最大でも10万回やれば、その中に異なる数字が6個あることは、ほぼほぼ期待していいだろう」ということになります。
118
+
119
+
120
+
121
+ #### (2) Lodash の shuffle を使う案
122
+
123
+
124
+
125
+ 配列の様々な操作が集められているライブラリ [Lodash](https://lodash.com/) に、 [shuffle](https://lodash.com/docs/4.17.10#shuffle) が用意されています。以下、これを使った例です。(なお、以下のコードは、Zuishinさんのご回答をコードにしたものの一例にもなっています。)
126
+
127
+
128
+
129
+ ```javascript
130
+
131
+ // 1 から 43 までを昇順に含む配列を作成
132
+
133
+ const ary1to43 = [...Array(43)].map((_,i) => i+1);
134
+
135
+
136
+
137
+ console.log(ary1to43);
138
+
139
+
140
+
141
+ // シャッフルした配列を作成
142
+
143
+ const shuffled1to43 = _.shuffle(ary1to43);
144
+
145
+
146
+
147
+ console.log(shuffled1to43);
148
+
149
+
150
+
151
+ // 先頭6個の配列を得る
152
+
153
+ const result = shuffled1to43.slice(0,6);
154
+
155
+
156
+
157
+ console.log(result);
158
+
159
+ ```
160
+
161
+
162
+
163
+ 以下、上記の動作確認用のサンプルです。
164
+
165
+
166
+
167
+ - [https://jsfiddle.net/jun68ykt/5thmspbk/5/](https://jsfiddle.net/jun68ykt/5thmspbk/5/)
168
+
169
+
170
+
171
+ なお、Lodash をCDNから利用する場合のURLは以下です。
172
+
173
+
174
+
175
+ - **cdnjs.com:** [https://cdnjs.com/libraries/lodash.js/](https://cdnjs.com/libraries/lodash.js/)
176
+
177
+  
178
+
179
+  
180
+
181
+
182
+
183
+ 以上参考になれば幸いです。

10

テキスト修正

2018/10/27 02:24

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 配列の様々な操作が集められているライブラリ [Lodash](https://lodash.com/) に、 [shuffle](https://lodash.com/docs/4.17.10#shuffle) が用意されています。以下、これを使った例です。
5
+ 配列の様々な操作が集められているライブラリ [Lodash](https://lodash.com/) に、 [shuffle](https://lodash.com/docs/4.17.10#shuffle) が用意されています。以下、これを使った例です。(なお、以下のコードは、Zuishinさんのご回答をコードにしたものの一例にもなっています。)
6
6
 
7
7
 
8
8
 
@@ -48,23 +48,19 @@
48
48
 
49
49
 
50
50
 
51
+ なお、Lodash をCDNから利用する場合のURLは以下です。
52
+
53
+
54
+
55
+ - **cdnjs.com:** [https://cdnjs.com/libraries/lodash.js/](https://cdnjs.com/libraries/lodash.js/)
56
+
57
+
58
+
51
59
  参考になれば幸いです。
52
60
 
53
61
 
54
62
 
55
- #### 補足1
63
+ #### 追記
56
-
57
-
58
-
59
- Lodash をCDNから利用する場合のURLは以下です。
60
-
61
-
62
-
63
- - [https://cdnjs.com/libraries/lodash.js/](https://cdnjs.com/libraries/lodash.js/)
64
-
65
-
66
-
67
- #### 補足2
68
64
 
69
65
 
70
66
 
@@ -76,11 +72,11 @@
76
72
 
77
73
 
78
74
 
79
- とありましたので、ご質問に挙げられているコードをなるべく生かす案を以下に回答します。
75
+ とありましたので、ご質問に挙げられているコードをなるべく生かす案を以下に追記します。
80
76
 
81
77
 
82
78
 
83
- ループ毎に1個ずつ乱数を生成してそれを `nums` に入れることは同じですが、その数が `nums` に含まれていない場合にのみ `nums`に追加します。のような追加の仕方で`nums`の長さが 6 になったときにループを終了させる、という考え方で修正したコードが以下です。(※これは ppn さんのご回答の、**要素数を減らしたくない場合** のコードとほぼ同じです。)
79
+ ループ毎に1個ずつ乱数を生成してそれを `nums` に入れることは同じですが、その数が `nums` に含まれていない場合にのみ `nums`に追加します。のような追加の仕方で`nums`の長さが 6 になったときにループから抜けます。このよ考え方で修正したコードが以下です。(※これは ppn さんのご回答の、**要素数を減らしたくない場合** のコードとほぼ同じです。)
84
80
 
85
81
 
86
82
 

9

テキスト修正

2018/10/27 02:16

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -80,7 +80,7 @@
80
80
 
81
81
 
82
82
 
83
- ループ毎に1個ずつ乱数を生成してそれを `nums` に入れることは同じですが、その乱数が `nums` に含まれていない場合にのみ `nums`に追加します。そのような追加の仕方で`nums`の長さが 6 になったときにループを終了させる、という考え方で修正したコードが以下です。
83
+ ループ毎に1個ずつ乱数を生成してそれを `nums` に入れることは同じですが、その乱数が `nums` に含まれていない場合にのみ `nums`に追加します。そのような追加の仕方で`nums`の長さが 6 になったときにループを終了させる、という考え方で修正したコードが以下です。(※これは ppn さんのご回答の、**要素数を減らしたくない場合** のコードとほぼ同じです。)
84
84
 
85
85
 
86
86
 

8

テキスト修正

2018/10/27 01:46

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -120,11 +120,7 @@
120
120
 
121
121
 
122
122
 
123
- しかし、上記だと必ず何回目かまで(あるいは、実用上耐えうる実行時間内)のループで、 `nums` に 6個の要素が詰め込まれる、とは言えず、無限ループの可能性がゼロではないです。(実際は限りなくゼロに近いでしょうけれども。)
123
+ しかし、上記だと必ず何回目かまで(あるいは、実用上耐えうる実行時間内)のループで、 `nums` に 6個の要素が詰め込まれる、とは言えず、無限ループの可能性がゼロではないです。(実際は限りなくゼロに近いでしょうけれども。)ですので、以下のように、乱数の生成回数に適度に上限を設けて、それに達したら `nums`の要素が6個に満たなくてもループを抜けるようにします。
124
-
125
-
126
-
127
- ですので、以下のように、乱数の生成回数に適度に上限を設けて、それに達したら、 `nums`の要素が6個に満たなくてもループを抜けるようにします。
128
124
 
129
125
 
130
126
 

7

テキスト修正

2018/10/26 20:05

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 配列の様々な操作が集められており便利な [Lodash](https://lodash.com/) に、 [shuffle](https://lodash.com/docs/4.17.10#shuffle) が用意されていますので、以下、これを使用する例です。
5
+ 配列の様々な操作が集められているライブラリ [Lodash](https://lodash.com/) に、 [shuffle](https://lodash.com/docs/4.17.10#shuffle) が用意されています以下、これを使った例です。
6
6
 
7
7
 
8
8
 

6

テキスト修正

2018/10/26 20:01

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -80,7 +80,7 @@
80
80
 
81
81
 
82
82
 
83
- ループ毎に1個ずつ乱数を生成してそれを `nums` に入れることは同じですが、すでにその乱数が `nums` に入っていないときのみ `nums` に追加することにし、そのような追加の仕方で`nums`の長さが 6 になったときにループを終了させる、という考え方で修正したコードが以下です。
83
+ ループ毎に1個ずつ乱数を生成してそれを `nums` に入れることは同じですが、その乱数が `nums` に含まれていない場合にのみ `nums`に追加しまそのような追加の仕方で`nums`の長さが 6 になったときにループを終了させる、という考え方で修正したコードが以下です。
84
84
 
85
85
 
86
86
 

5

テキスト追加

2018/10/26 20:00

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
 
122
122
 
123
- しかし、上記だと必ず何回目かまで(あるいは、実用上耐えうる実行時間内)のループで、 `nums` に 6個の要素が詰め込まれる、とは言えないので、無限ループの可能性がゼロではないです。(実際は限りなくゼロに近いでしょうけれども。)
123
+ しかし、上記だと必ず何回目かまで(あるいは、実用上耐えうる実行時間内)のループで、 `nums` に 6個の要素が詰め込まれる、とは言え、無限ループの可能性がゼロではないです。(実際は限りなくゼロに近いでしょうけれども。)
124
124
 
125
125
 
126
126
 

4

テキスト追加

2018/10/26 06:20

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
 
122
122
 
123
- しかし、上記だと必ず何回目か(あるいは実用上耐えうる実行時間内)のループで、 `nums` に 6個の要素が詰め込まれる、とは言えないので、無限ループの可能性がゼロではないです。
123
+ しかし、上記だと必ず何回目かまで(あるいは実用上耐えうる実行時間内)のループで、 `nums` に 6個の要素が詰め込まれる、とは言えないので、無限ループの可能性がゼロではないです。(実際は限りなくゼロに近いでしょうけれども。)
124
124
 
125
125
 
126
126
 

3

テキスト追加

2018/10/26 05:56

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- Lodash をCDNから利用する場合のURL以下です。
59
+ Lodash をCDNから利用する場合のURL以下です。
60
60
 
61
61
 
62
62
 

2

テキスト追加

2018/10/26 05:45

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -52,12 +52,122 @@
52
52
 
53
53
 
54
54
 
55
- #### 補足
55
+ #### 補足1
56
56
 
57
57
 
58
58
 
59
- CDN以下です。
59
+ Lodash をCDNから利用する場合のURL以下です。
60
60
 
61
61
 
62
62
 
63
63
  - [https://cdnjs.com/libraries/lodash.js/](https://cdnjs.com/libraries/lodash.js/)
64
+
65
+
66
+
67
+ #### 補足2
68
+
69
+
70
+
71
+ ご質問に
72
+
73
+
74
+
75
+ > 上記のコードを生かして
76
+
77
+
78
+
79
+ とありましたので、ご質問に挙げられているコードをなるべく生かす案を以下に回答します。
80
+
81
+
82
+
83
+ ループ毎に1個ずつ乱数を生成してそれを `nums` に入れることは同じですが、すでにその乱数が `nums` に入っていないときのみ、 `nums` に追加することにし、そのような追加の仕方で、 `nums`の長さが 6 になったときにループを終了させる、という考え方で修正したコードが以下です。
84
+
85
+
86
+
87
+ ```javascript
88
+
89
+ var nums = []; // ランダム数字6桁の配列
90
+
91
+
92
+
93
+ var min = 1; // 最小値
94
+
95
+ var max = 43; // 最大値
96
+
97
+
98
+
99
+ while (nums.length < 6) {
100
+
101
+ var n = Math.floor(Math.random()*(max + 1 - min )) + min;
102
+
103
+ if (!nums.includes(n))
104
+
105
+ nums.push(n);
106
+
107
+ }
108
+
109
+
110
+
111
+ console.log(nums);
112
+
113
+ ```
114
+
115
+
116
+
117
+ - **上記のサンプル: ** [https://jsfiddle.net/jun68ykt/snj6carq/2/](https://jsfiddle.net/jun68ykt/snj6carq/2/)
118
+
119
+
120
+
121
+
122
+
123
+ しかし、上記だと必ず何回目か(あるいは実用上耐えうる実行時間内)のループで、 `nums` に 6個の要素が詰め込まれる、とは言えないので、無限ループの可能性がゼロではないです。
124
+
125
+
126
+
127
+ ですので、以下のように、乱数の生成回数に適度に上限を設けて、それに達したら、 `nums`の要素が6個に満たなくてもループを抜けるようにします。
128
+
129
+
130
+
131
+ ```javascript
132
+
133
+ var nums = []; // ランダム数字6桁の配列
134
+
135
+
136
+
137
+ var min = 1; // 最小値
138
+
139
+ var max = 43; // 最大値
140
+
141
+
142
+
143
+ var count = 0; // 乱数を生成した回数
144
+
145
+ var MAX_COUNT = 100000; // 乱数生成回数の上限
146
+
147
+
148
+
149
+ while (nums.length < 6 && count < MAX_COUNT) {
150
+
151
+ var n = Math.floor(Math.random()*(max + 1 - min )) + min;
152
+
153
+ if (!nums.includes(n))
154
+
155
+ nums.push(n);
156
+
157
+ count ++;
158
+
159
+ }
160
+
161
+
162
+
163
+ console.log(nums);
164
+
165
+ ```
166
+
167
+
168
+
169
+ - **上記のサンプル: ** [https://jsfiddle.net/jun68ykt/L82xsv9e/1/](https://jsfiddle.net/jun68ykt/L82xsv9e/1/)
170
+
171
+
172
+
173
+ 上記のコードの意図は、「1から43までの数から無作為に一個取ることを、最大でも10万回やれば、その中に異なる数字が6個あることは、ほぼほぼ期待していいだろう」ということになります。

1

テキスト追加

2018/10/26 05:44

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -49,3 +49,15 @@
49
49
 
50
50
 
51
51
  参考になれば幸いです。
52
+
53
+
54
+
55
+ #### 補足
56
+
57
+
58
+
59
+ CDNは以下です。
60
+
61
+
62
+
63
+ - [https://cdnjs.com/libraries/lodash.js/](https://cdnjs.com/libraries/lodash.js/)