質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

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

Q&A

解決済

2回答

792閲覧

多次元配列と再帰呼び出しについて

gyoruo

総合スコア61

JavaScript

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

0グッド

0クリップ

投稿2019/09/29 13:57

多次元配列で[0,1], [2,3], [4,5]みたいなものを作りたいのですが、main関数の結果は下記の写真のように[x,x],[x,x]となってしまいます。
イメージ説明

そこで3つ質問です。
① [[0,1], [2,3], [4,5]]みたいに配列の中に配列を作るときは下記のmain関数の処理をどのように変更すれば実現できますか?

② rand()をstimu変数に入れているのでmain(stimu)の値が何回やっても同じになるのは分かるんですが、どうすればランダムに取り出してmain()のendList[]に追加できますか?

③ rand()の取り出す処理でdocument.write("<div>"+combo+"</div>");を追加すると結果は下記の写真みたいに42個の組み合わせ全てを取得できるんですが、return combo;すると最初の1組だけ取得されてしまいます。なぜでしょうか?
イメージ説明

JavaScript

1//main関数 2function main(stimu) { 3 var endList = []; 4 5 endList.push([stimu[0], stimu[1]]); 6 console.log(endList[0]); 7 endList.push([stimu[0], stimu[1]]); 8 console.log(endList[1]); 9} 10 11 12//ランダムな値を取得 13function rand() { 14 var movieList = [0, 1, 2, 3, 4, 5, 6]; 15 var movie_1, movie_2; 16 17 // 組み合わせの用意 18 var movieComb = []; 19 for (var i = 0; i < movieList.length; i++) { 20 for (var j = 0; j < movieList.length; j++) { 21 if (movieList[i] !== movieList[j]) { 22 movieComb.push([movieList[i], movieList[j]]); 23 } 24 } 25 } 26 27 // シャッフルする 28 for (var i = movieComb.length - 1; i > 0; i--) { 29 var r = Math.floor(Math.random() * (i + 1)); 30 var tmp = movieComb[i]; 31 movieComb[i] = movieComb[r]; 32 movieComb[r] = tmp; 33 } 34 // 取り出す 35 for (var i = 0; i < movieComb.length; i++) { 36 movie_1 = movieComb[i][0]; 37 movie_2 = movieComb[i][1]; 38 var combo = movieComb[I]; 39 document.write("<div>"+combo+"</div>"); 40 return combo; 41 } 42} 43var stimu = rand();

どうか、解決方法をよろしくお願い致します。

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

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

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

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

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

tanishi_a

2019/09/29 14:05 編集

ちゃんと読んでないですが、下記の i が大文字なのは怪しいですね。 > movieComb[I];
gyoruo

2019/09/29 15:58

ありがとうございます。 そこを直してもできませんでした、、、
tanishi_a

2019/09/29 21:33

そうですね。その他のところ含めて回答欄に書いたので確認してみてください。
guest

回答2

0

こんな感じで

javascript

1const a=Array(7).fill(null).map((x,y)=>y); 2var b=[]; 3a.forEach(x=>a.forEach(y=>b.push([x,y]))); 4b=b.filter(x=>x[0]!==x[1]).map(x=>[x,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]); 5console.log(b);

投稿2019/09/30 00:29

yambejp

総合スコア114572

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

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

0

ベストアンサー

③ は、 combo という1要素しか返してないからですね。
たぶん返したいのは 全部の組み合わせなので、こうだと思います。

js

1// 取り出す 2var combos = []; 3for (...) { 4 ... 5 var combo = movieComb[i]; // ※ 大文字 => 小文字にした 6 combos.push(combo); 7} 8return combos; 9

①②は読んだら追記します。

## 以下、追記

③については、
rand 関数内の // 取り出す 以下は不要で、return movieComb; したらいいと思います

①②については、

やろうとしてることは、こういうことだと思いますが、

function main(stimu) { var endList = []; endList.push(stimu[Math.floor(Math.random() * stimu.length)]); endList.push(stimu[Math.floor(Math.random() * stimu.length)]); console.log(endList); }

これだと重複してしまうのと、既にシャッフルしてあるようなので、以下のように順番に取り出せば良いと思います。

js

1function main(stimu) { 2 var endList = []; 3 endList.push(stimu[0]); 4 endList.push(stimu[1]); 5 console.log(endList); 6}

・・・

※ それから 本質とは関係ない補足ですが、

関数名ですが rand() は乱数を返す関数に見えてしまうので、別の名前にしたほうが良いと思いました。 なんでもいいですが、 getRandomCombinations() とか。 stimu も何だかわからないですが。

それと、タイトルの「再帰呼び出し」は関係ないように思います。

・・・

### さらに追記

もとのコードを見るに、書きたかったのは、こういうことだったかも?

js

1//main関数 2function main() { 3 var endList = []; 4 5 endList.push(rand()); 6 endList.push(rand()); 7 console.log(endList); 8} 9 10 11//ランダムな値を取得 12function rand() { 13 var movieList = [0, 1, 2, 3, 4, 5, 6]; 14 15 // 組み合わせの用意 16 var movieComb = []; 17 for (var i = 0; i < movieList.length; i++) { 18 for (var j = 0; j < movieList.length; j++) { 19 if (movieList[i] !== movieList[j]) { 20 movieComb.push([movieList[i], movieList[j]]); 21 } 22 } 23 } 24 25 // シャッフルする 26 for (var i = movieComb.length - 1; i > 0; i--) { 27 var r = Math.floor(Math.random() * (i + 1)); 28 var tmp = movieComb[i]; 29 movieComb[i] = movieComb[r]; 30 movieComb[r] = tmp; 31 } 32 33 // 取り出す 34 return movieComb[Math.floor(Math.random() * movieComb.length)]; 35} 36 37main();

投稿2019/09/29 14:20

編集2019/09/29 15:03
tanishi_a

総合スコア484

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問