🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

1回答

439閲覧

組み合わせの処理内容で迷っています。

gyoruo

総合スコア61

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2019/09/13 16:05

ループ処理について質問です。

リストを1つ用意して、ランダムに値を2つ取得します。
同じ値同士だともう1回取得し、違う値だと処理を続けます。異なる組み合わせを"1回ずつ"行うにはどのように処理を行えばいいのか教えて欲しいです。(0,1)と(1,0)も1回ずつに含むので以下のリストだと合計で42回ループ処理を行うことになります。(0,1)はmovie1が0で、movie2が1という意味です。

javaScript

1// ランダムな値を取得 2function rand() { 3 var movieList = [0, 1, 2, 3, 4, 5, 6]; 4 var randNum1 = movieList[Math.floor(Math.random() * movieList.length)]; 5 var randNum2 = movieList[Math.floor(Math.random() * movieList.length)]; 6 return randNum1, randNum2; 7} 8var randNum1 = rand(); 9var randNum2 = rand(); 10 11// 取得した値を表示 12function movie(randNum1, randNum2) { 13 var movie1 = randNum1; 14 var movie2 = randNum2; 15 16 for(i = 0; i <= 41; i++) { 17 if(movie1 === movie2) { 18 continue; 19 } 20 else { 21 22 } 23 i++; 24 } 25 alert(movie1); 26 alert(movie2); 27}

forとelseの処理で迷っています。まだ全てコードは書けてませんが、このままだと42回のループの中に例えば、(1,0)が2回入っていてもループが継続され、(2,3)の組み合わせが1回も処理されずにループ処理が終了してしまいます。

どうか皆様のお力をお貸しください。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こういうときは問題を切り分けて考えましょう。一気に実装しようとすると混乱します。

1. 組み合わせを用意する

JavaScript

1let movieList = [0, 1, 2, 3, 4, 5, 6]; 2 3// 組み合わせの用意 4let movieComb = movieList.map( n => { 5 return movieList 6 .map( m => [n, m] ) 7 .filter( elm => elm[0] !== elm[1] ); 8}).flat();

2重ループで回し、値が違うものだけをリストに追加します。上記では map 関数等を使って多少記述を楽にしていますが、 for 文で済ませる場合でも同じように考えることができます。

JavaScript

1let movieList = [0, 1, 2, 3, 4, 5, 6]; 2 3// 組み合わせの用意 4let movieComb = []; 5for (let i = 0; i < movieList.length; i++) { 6 for (let j = 0; j < movieList.length; j++) { 7 if (movieList[i] !== movieList[j]) { 8 movieComb.push([movieList[i], movieList[j]]); 9 } 10 } 11}

2. シャッフルする

配列をシャッフルしてしまえばランダムに取り出すのと同じです。

JavaScriptで配列をシャッフルする方法 - Qiita

このページの内容がわかりやすいです。

JavaScript

1// シャッフルする 2// https://qiita.com/komaji504/items/62a0f8ea43053e90555a 3for (let i = movieComb.length - 1; i > 0; i--) { 4 const r = Math.floor(Math.random() * (i + 1)); 5 const tmp = movieComb[i]; 6 movieComb[i] = movieComb[r]; 7 movieComb[r] = tmp; 8}

3. 取り出す

最後に取り出します。特筆すべきことはないです。

ここで movie1movie2 に代入するといいでしょう。

JavaScript

1let movie1, movie2; 2 3// 取り出す 4for (let i = 0; i < movieComb.length; i++) { 5 // alert(movieComb[i]); 6 document.write("<div>"+i+": "+movieComb[i]+"</div>"); 7 movie1 = movieComb[i][0]; 8 movie2 = movieComb[i][1]; 9 // 以降movie1,2を用いた処理 10}

全体

JavaScript

1let movieList = [0, 1, 2, 3, 4, 5, 6]; 2let movie1, movie2; 3 4// 組み合わせの用意 5let movieComb = movieList.map( n => { 6 return movieList 7 .map( m => [n, m] ) 8 .filter( elm => elm[0] !== elm[1] ); 9}).flat(); 10 11console.log(movieComb); // 42個生成されてることをデバッガーから確認できます。 12 13// シャッフルする 14// https://qiita.com/komaji504/items/62a0f8ea43053e90555a 15for (let i = movieComb.length - 1; i > 0; i--) { 16 const r = Math.floor(Math.random() * (i + 1)); 17 const tmp = movieComb[i]; 18 movieComb[i] = movieComb[r]; 19 movieComb[r] = tmp; 20} 21 22// 取り出す 23for (let i = 0; i < movieComb.length; i++) { 24 // alert(movieComb[i]); 25 document.write("<div>"+i+": "+movieComb[i]+"</div>"); 26 movie1 = movieComb[i][0]; 27 movie2 = movieComb[i][1]; 28 // 以降movie1,2を用いた処理 29}

冒頭に述べたとおり、問題を切り分けることで簡単に解決できます。

投稿2019/09/13 19:18

編集2019/09/13 19:30
namnium1125

総合スコア2045

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問