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

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

詳細はこちら
JavaScript

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

Q&A

解決済

3回答

914閲覧

重複しない乱数の記述がうまく動作しません

hisayan

総合スコア60

JavaScript

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

0グッド

1クリップ

投稿2019/11/15 04:42

Javascript

1let randoms = []; 2let min = 1,max = 10; 3 4let getRandom(min,max){ 5 return Math.floor(Math.random()*(max - min +1)+min); 6} 7 8for (i = min; i <= max ; i++){ 9 while(true){ 10 let tmp = getRandom(min,max); 11 if(!randoms.includes(tmp)){ 12 randoms.push(tmp); 13 break; 14 } 15 } 16}

ネットの記事や本を見て1から10までの乱数を発生させる記述を作りましたが、実行すると Expected";"と表示されてしまいます。
もう一歩のような感じがしますが、;は不足していないように思うのですが、どこがいけないのかご教示いただけないでしょうか。よろしくお願いします。

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

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

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

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

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

m.ts10806

2019/11/15 04:55

自身で自身のコードを解説できますか?
miyabi_takatsuk

2019/11/15 10:34

過去質問を併せて鑑みて、 まだ基本も理解できてないとお見受けします。 基本を理解されてない質問者さんが、 while(true)なんて使っちゃいけません。(JSじゃなくても、Javaではよく使われるらしいが、それでもwhileの性質を理解しないで使うのは危険) 含め、自身のコードをしっかり理解しましょう。
yutampp

2019/11/15 13:12

そのう・・・質問とは外れるんですけど。 そのロジックだと、範囲が狭いうちはいいものの、1~1000とか大きい範囲の乱数を作ろうとすると、時間がかかりすぎると思います。 それは1000個の穴を作って、その穴にボールが全部キレイに収まるまで、目隠しをしながらボールを投げ続けるようなものです。 その拷問じみた遊びは、終わりに近づくに連れ難易度が増すというのは分かっていただけるでしょうか。 質問から離れてしまって申し訳ないのですが、ロジックを考え直すことをおすすめします。
miyabi_takatsuk

2019/11/15 13:30

yutamppさん> 例えがめちゃくちゃしっくりきました・・・。 下手したら無限に等しい処理数になる可能性がありますよね。
hisayan

2019/11/16 00:18

皆様のご指摘の通りで、以下の記述あたりは while(true){ let tmp = getRandom(min,max); if(!randoms.includes(tmp)){ randoms.push(tmp); 大体こんな意味かなという感じでとらえていました。 よって今回の記述はあきらめて出直します。 ありがとうございました。
m.ts10806

2019/11/16 00:25

変数と関数あたりの基本からやりなおしたほうが良いかと。やりたいことだけを追求しても書いた通りにしか動かないので基礎がごっそり抜けてる状態で動かないのは当然です(たぶんこれ初めての指摘じゃないはずなんだが)
guest

回答3

0

ベストアンサー

javascri@t

1const randoms = Array(10).fill(null).map((x,y)=>[Math.random(),y+1]).sort((x,y)=>x[0]-y[0]).map(x=>x[1]); 2console.log(randoms); 3

投稿2019/11/15 04:56

yambejp

総合スコア116690

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

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

0

javaScirpt

1let randoms = []; 2let min = 1,max = 10; 3 4function getRandom(min,max){ 5 return Math.floor(Math.random()*(max - min +1)+min); 6} 7 8for (i = min; i <= max ; i++){ 9 while(true){ 10 let tmp = getRandom(min,max); 11 if(!randoms.includes(tmp)){ 12 randoms.push(tmp); 13 break; 14 } 15 } 16} 17console.log(randoms);

出力結果

[ 8, 2, 7, 5, 3, 1, 6, 4, 10, 9 ]

let → function に変えただけですが一応動くっぽいですね


関数式を使いたいならこうでしょうか?

javaScript

1let randoms = []; 2let min = 1,max = 10; 3 4let getRandom = function(min,max){ 5 return Math.floor(Math.random()*(max - min +1)+min); 6} 7 8for (i = min; i <= max ; i++){ 9 while(true){ 10 let tmp = getRandom(min,max); 11 if(!randoms.includes(tmp)){ 12 randoms.push(tmp); 13 break; 14 } 15 } 16} 17console.log(randoms);

出力結果

[ 9, 10, 8, 2, 5, 7, 4, 1, 3, 6 ]

投稿2019/11/15 04:47

編集2019/11/15 05:18
azuapricot

総合スコア2341

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

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

m.ts10806

2019/11/15 05:00

インデントもこっそりキレイになってるところに全米が
azuapricot

2019/11/15 05:16

(見づらかったので Shift + Tab と Tab を使って適当に直しただけ...)
hisayan

2019/11/16 00:33

自分にはまだ難しすぎましたが、何となく意味は分かります。ありがとうございました。
m.ts10806

2019/11/16 02:37

ベストアンサーに選ばれた回答のコードは上級者向けで私もある程度調べないと理解できないコードですが、「難しすぎる」わけではないんですか? あれが理解できるのでしたら今回の質問は出てないと思います。 「要件通り動いたからOK。なんかすごいコードもらったからOK」で済ませてません?毎回。
guest

0

なぜ、動かないのか、それは let の使い方に誤りがあるから
リファレンス等、ちゃんと確認してください

let 文はブロックスコープの局所変数を宣言します

JavaScript

1//誤り 2let getRandom(min,max){

よく理解していないけど、最新の記述式でかっこよく書きたいというなら

JavaScript

1let getRandom = ( min, max ) => {

投稿2019/11/15 09:52

pinoko

総合スコア127

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問