回答編集履歴
5
先にmenu1をシャッフルしてmenu2が取り出し順で同じ値にならなくなるまでシャッフルを繰り返す方法を追記
test
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
各処理をわかり易く書こうと思ったら、
|
20
20
|
|
21
|
-
すごく冗長なコードになってしまったので、
|
21
|
+
すごく冗長なコードになってしまったので、かなりリファクタリング出来ると思います。
|
22
22
|
|
23
23
|
```javascript
|
24
24
|
|
@@ -355,3 +355,125 @@
|
|
355
355
|
}();
|
356
356
|
|
357
357
|
```
|
358
|
+
|
359
|
+
|
360
|
+
|
361
|
+
---
|
362
|
+
|
363
|
+
|
364
|
+
|
365
|
+
**追記**
|
366
|
+
|
367
|
+
下記の手順で取り出す方法を追記します。
|
368
|
+
|
369
|
+
0. menu1をシャッフルするして順番を入れ替える
|
370
|
+
|
371
|
+
0. menu2をシャッフルする
|
372
|
+
|
373
|
+
0. インデックス順に各配列の要素を取り出してチェック。1回でも値が同じ場合があると2をやり直し
|
374
|
+
|
375
|
+
0. インデックス順に各配列の要素を取り出す
|
376
|
+
|
377
|
+
|
378
|
+
|
379
|
+
```javascript
|
380
|
+
|
381
|
+
var menu1 = ["ジュース","チョコ","アメ"];
|
382
|
+
|
383
|
+
var menu2 = ["ジュース","チョコ","アメ"];
|
384
|
+
|
385
|
+
var sameFlg = true;
|
386
|
+
|
387
|
+
|
388
|
+
|
389
|
+
// fisher-yates アルゴリズム
|
390
|
+
|
391
|
+
// katoyさんの書かれている配列をシャッフルする方法
|
392
|
+
|
393
|
+
var shuffle = function(arg) {
|
394
|
+
|
395
|
+
var i, j, l, tmp;
|
396
|
+
|
397
|
+
for(l=arg.length, i=l-1; i>0; i-=1) {
|
398
|
+
|
399
|
+
j = Math.floor(Math.random() * (i+1));
|
400
|
+
|
401
|
+
tmp = arg[i];
|
402
|
+
|
403
|
+
arg[i] = arg[j];
|
404
|
+
|
405
|
+
arg[j] = tmp;
|
406
|
+
|
407
|
+
}
|
408
|
+
|
409
|
+
return arg;
|
410
|
+
|
411
|
+
};
|
412
|
+
|
413
|
+
|
414
|
+
|
415
|
+
// menu1をシャッフル
|
416
|
+
|
417
|
+
menu1 = shuffle(menu1);
|
418
|
+
|
419
|
+
|
420
|
+
|
421
|
+
while(sameFlg) {
|
422
|
+
|
423
|
+
// menu2をシャッフル
|
424
|
+
|
425
|
+
menu2 = shuffle(menu2);
|
426
|
+
|
427
|
+
// 順番に取り出して同じ値が出てくる時はmenu2のシャッフルをやり直す
|
428
|
+
|
429
|
+
sameFlg = false;
|
430
|
+
|
431
|
+
for(var i = 0, l = menu1.length; i<l; i+=1) {
|
432
|
+
|
433
|
+
if(menu1[i] === menu2[i]) {
|
434
|
+
|
435
|
+
sameFlg = true;
|
436
|
+
|
437
|
+
break;
|
438
|
+
|
439
|
+
}
|
440
|
+
|
441
|
+
}
|
442
|
+
|
443
|
+
}
|
444
|
+
|
445
|
+
|
446
|
+
|
447
|
+
console.log('▼ menu1, menu2 それぞれの取り出し順 ▼');
|
448
|
+
|
449
|
+
console.log(menu1, menu2);
|
450
|
+
|
451
|
+
for(var i = 0, l = menu1.length; i<l; i+=1) {
|
452
|
+
|
453
|
+
console.log(menu1[i] + " と " + menu2[i]);
|
454
|
+
|
455
|
+
}
|
456
|
+
|
457
|
+
```
|
458
|
+
|
459
|
+
|
460
|
+
|
461
|
+
---
|
462
|
+
|
463
|
+
|
464
|
+
|
465
|
+
いずれにせよ
|
466
|
+
|
467
|
+
A. menu1の`ジュース`とmenu2の`ジュース`を区別する
|
468
|
+
|
469
|
+
= それぞれの袋の中から1つづつ取り出しす かつ 取り出されたモノ(の種類)が被らないようにする
|
470
|
+
|
471
|
+
B. `ジュース`というも区別できないモノのが2つ有るとする
|
472
|
+
|
473
|
+
= 大きな袋に全部入れてランダムに2つ取り出して、取り出されたモノが被らないようにする
|
474
|
+
|
475
|
+
|
476
|
+
|
477
|
+
のどちらかによってコードは変わってくると思います。
|
478
|
+
|
479
|
+
私が書いたのはいずれも、A. の考え方の場合です。
|
4
変数名がわかりにくい箇所を修正
test
CHANGED
@@ -238,7 +238,7 @@
|
|
238
238
|
|
239
239
|
var patterns = [];
|
240
240
|
|
241
|
-
var sortArg = function(a
|
241
|
+
var sortArg = function(allPtns, ptnArg, post, n) {
|
242
242
|
|
243
243
|
if(n > 0) {
|
244
244
|
|
@@ -250,15 +250,15 @@
|
|
250
250
|
|
251
251
|
next = rest.splice(i, 1);
|
252
252
|
|
253
|
-
sortArg(a
|
253
|
+
sortArg(allPtns, ptnArg.concat(next), rest, n-1);
|
254
254
|
|
255
255
|
}
|
256
256
|
|
257
257
|
} else {
|
258
258
|
|
259
|
-
console.log(t
|
259
|
+
console.log(ptnArg);
|
260
|
-
|
260
|
+
|
261
|
-
a
|
261
|
+
allPtns[ allPtns.length ] = ptnArg;
|
262
262
|
|
263
263
|
}
|
264
264
|
|
3
ちょっとイケてない記述を修正
test
CHANGED
@@ -234,31 +234,41 @@
|
|
234
234
|
|
235
235
|
// 配列の並び順のパターンを作成
|
236
236
|
|
237
|
+
var generatePatterns = function(arg) {
|
238
|
+
|
239
|
+
var patterns = [];
|
240
|
+
|
237
|
-
var
|
241
|
+
var sortArg = function(arg, tmp, post, n) {
|
238
|
-
|
242
|
+
|
239
|
-
if(n > 0) {
|
243
|
+
if(n > 0) {
|
240
|
-
|
244
|
+
|
241
|
-
var next, rest;
|
245
|
+
var next, rest;
|
242
|
-
|
246
|
+
|
243
|
-
for(var i=0, l=post.length; i<l; i+=1) {
|
247
|
+
for(var i=0, l=post.length; i<l; i+=1) {
|
244
|
-
|
248
|
+
|
245
|
-
rest = post.slice(0);
|
249
|
+
rest = post.slice(0);
|
246
|
-
|
250
|
+
|
247
|
-
next = rest.splice(i, 1);
|
251
|
+
next = rest.splice(i, 1);
|
248
|
-
|
252
|
+
|
249
|
-
|
253
|
+
sortArg(arg, tmp.concat(next), rest, n-1);
|
250
|
-
|
254
|
+
|
251
|
-
}
|
255
|
+
}
|
252
|
-
|
256
|
+
|
253
|
-
} else {
|
257
|
+
} else {
|
254
|
-
|
258
|
+
|
255
|
-
console.log(tmp);
|
259
|
+
console.log(tmp);
|
256
|
-
|
260
|
+
|
257
|
-
arg[ arg.length ] = tmp;
|
261
|
+
arg[ arg.length ] = tmp;
|
258
|
-
|
262
|
+
|
259
|
-
}
|
263
|
+
}
|
260
|
-
|
264
|
+
|
261
|
-
}
|
265
|
+
};
|
266
|
+
|
267
|
+
sortArg(patterns, [], arg, arg.length);
|
268
|
+
|
269
|
+
return patterns;
|
270
|
+
|
271
|
+
};
|
262
272
|
|
263
273
|
|
264
274
|
|
@@ -268,9 +278,9 @@
|
|
268
278
|
|
269
279
|
l = 0,
|
270
280
|
|
271
|
-
allPatternsA
|
281
|
+
allPatternsA,
|
272
|
-
|
282
|
+
|
273
|
-
allPatternsB
|
283
|
+
allPatternsB,
|
274
284
|
|
275
285
|
randA,
|
276
286
|
|
@@ -288,11 +298,11 @@
|
|
288
298
|
|
289
299
|
console.log('▼ menuAの取り出し方の全パターン ▼');
|
290
300
|
|
291
|
-
|
301
|
+
allPatternsA = generatePatterns(menuA);
|
292
302
|
|
293
303
|
console.log('▼ menuBの取り出し方の全パターン ▼');
|
294
304
|
|
295
|
-
|
305
|
+
allPatternsB = generatePatterns(menuB);
|
296
306
|
|
297
307
|
|
298
308
|
|
2
変数名の間違いを修正
test
CHANGED
@@ -198,9 +198,9 @@
|
|
198
198
|
|
199
199
|
```javascript
|
200
200
|
|
201
|
-
var menu
|
201
|
+
var menuA = ["ジュース","チョコ","アメ"];
|
202
|
-
|
202
|
+
|
203
|
-
var menu
|
203
|
+
var menuB = ["チョコ","ジュース","アメ","バナナ"];
|
204
204
|
|
205
205
|
|
206
206
|
|
1
配列の値でチェックするパターンを追加
test
CHANGED
@@ -193,3 +193,155 @@
|
|
193
193
|
0. 同じ取り出し順に同じ値があったら2をやり直し
|
194
194
|
|
195
195
|
0. ループで各配列の並び順に出力
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
```javascript
|
200
|
+
|
201
|
+
var menu1 = ["ジュース","チョコ","アメ"];
|
202
|
+
|
203
|
+
var menu2 = ["チョコ","ジュース","アメ","バナナ"];
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
// 配列の長さを同じにする
|
208
|
+
|
209
|
+
var adjustLength = function(arg1, arg2) {
|
210
|
+
|
211
|
+
var l1 = arg1.length,
|
212
|
+
|
213
|
+
l2 = arg2.length,
|
214
|
+
|
215
|
+
gap = Math.abs(l1 - l2),
|
216
|
+
|
217
|
+
adjustArg;
|
218
|
+
|
219
|
+
if(gap) {
|
220
|
+
|
221
|
+
adjustArg = (l1 > l2)? arg2:arg1;
|
222
|
+
|
223
|
+
for(var i=0; i<gap; i+=1) {
|
224
|
+
|
225
|
+
adjustArg[ adjustArg.length ] = "なし!";
|
226
|
+
|
227
|
+
}
|
228
|
+
|
229
|
+
}
|
230
|
+
|
231
|
+
};
|
232
|
+
|
233
|
+
|
234
|
+
|
235
|
+
// 配列の並び順のパターンを作成
|
236
|
+
|
237
|
+
var generatePatterns = function(arg, tmp, post, n) {
|
238
|
+
|
239
|
+
if(n > 0) {
|
240
|
+
|
241
|
+
var next, rest;
|
242
|
+
|
243
|
+
for(var i=0, l=post.length; i<l; i+=1) {
|
244
|
+
|
245
|
+
rest = post.slice(0);
|
246
|
+
|
247
|
+
next = rest.splice(i, 1);
|
248
|
+
|
249
|
+
generatePatterns(arg, tmp.concat(next), rest, n-1);
|
250
|
+
|
251
|
+
}
|
252
|
+
|
253
|
+
} else {
|
254
|
+
|
255
|
+
console.log(tmp);
|
256
|
+
|
257
|
+
arg[ arg.length ] = tmp;
|
258
|
+
|
259
|
+
}
|
260
|
+
|
261
|
+
}
|
262
|
+
|
263
|
+
|
264
|
+
|
265
|
+
!function() {
|
266
|
+
|
267
|
+
var i = 0,
|
268
|
+
|
269
|
+
l = 0,
|
270
|
+
|
271
|
+
allPatternsA = [],
|
272
|
+
|
273
|
+
allPatternsB = [],
|
274
|
+
|
275
|
+
randA,
|
276
|
+
|
277
|
+
randB,
|
278
|
+
|
279
|
+
ptnA,
|
280
|
+
|
281
|
+
ptnB,
|
282
|
+
|
283
|
+
isSame = true;
|
284
|
+
|
285
|
+
|
286
|
+
|
287
|
+
adjustLength(menuA, menuB);
|
288
|
+
|
289
|
+
console.log('▼ menuAの取り出し方の全パターン ▼');
|
290
|
+
|
291
|
+
generatePatterns(allPatternsA, [], menuA, menuA.length);
|
292
|
+
|
293
|
+
console.log('▼ menuBの取り出し方の全パターン ▼');
|
294
|
+
|
295
|
+
generatePatterns(allPatternsB, [], menuB, menuB.length);
|
296
|
+
|
297
|
+
|
298
|
+
|
299
|
+
randA = Math.floor( Math.random() * allPatternsA.length );
|
300
|
+
|
301
|
+
ptnA = allPatternsA[randA];
|
302
|
+
|
303
|
+
while(isSame) {
|
304
|
+
|
305
|
+
randB = Math.floor( Math.random() * allPatternsB.length );
|
306
|
+
|
307
|
+
ptnB = allPatternsB[randB];
|
308
|
+
|
309
|
+
isSame = false;
|
310
|
+
|
311
|
+
for(i=0, l=ptnA.length; i<l; i+=1) {
|
312
|
+
|
313
|
+
// 取り出し順の値が被らないかチェック
|
314
|
+
|
315
|
+
if(ptnA[i] === ptnB[i]) {
|
316
|
+
|
317
|
+
isSame = true;
|
318
|
+
|
319
|
+
break;
|
320
|
+
|
321
|
+
}
|
322
|
+
|
323
|
+
}
|
324
|
+
|
325
|
+
}
|
326
|
+
|
327
|
+
console.log('▼ menuA, menuB それぞれの取り出し順 ▼');
|
328
|
+
|
329
|
+
console.log(ptnA, ptnB);
|
330
|
+
|
331
|
+
|
332
|
+
|
333
|
+
console.log('▼ 決まった取り出し順に基いて順番に取り出す ▼');
|
334
|
+
|
335
|
+
for(i=0, l=ptnA.length; i<l; i+=1) {
|
336
|
+
|
337
|
+
var m1 = ptnA[i],
|
338
|
+
|
339
|
+
m2 = ptnB[i];
|
340
|
+
|
341
|
+
console.log(m1 + 'と' + m2);
|
342
|
+
|
343
|
+
}
|
344
|
+
|
345
|
+
}();
|
346
|
+
|
347
|
+
```
|