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

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

詳細はこちら
JavaScript

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

Q&A

解決済

4回答

481閲覧

条件分岐が多い場合の(動作上の?)問題点や記述方法について

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2021/03/05 13:20

編集2021/03/05 15:30

###実現したいこと
確率に偏りのあるランダムを使った条件分け処理を実現するために、Math.floor(Math.random()*100)で取得した内容を、数値099の間で範囲を区切った条件分けに使用する。
###遭遇した問題点と質問
下に記すコードを実行すると、alert(random)は確実に実行されているように見える。しかし、alert(number(+数値))は、一定数以下(全体の1/3
1/2程度)までしか実行されていないように見える。
####疑問点

  • この現象が起こっている原因を知りたい。
  • 条件の範囲で意図した動作が可能(な可能性がある)ならば、記述例を知りたい。

####条件

  • 各処理(const, if)は同等処理が30個前後続く。
  • number(+数値)は増加していくが、増加値に規則性はない。
  • 1つのjsファイルのみで実行する(データべース等は使用しない)。

JavaScript

1const random = Math.floor(Math.random()*100) 2alert(random); 3 4const number1 = 8; 5const number2 = 15; 6const number3 = 16; 7 8if (random < number1) {alert(number1);} 9else if (random < number2) {alert(number2);} 10else if (random < number3) {alert(number3);} 11

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

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

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

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

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

Daregada

2021/03/05 13:26

変数1,2,...の値の大小関係はどうなっていますか?
退会済みユーザー

退会済みユーザー

2021/03/05 13:50

ご指摘ありがとうございます。先にコメントにて失礼します。 下に行くほど大きくしています。 ------ 処理1条件:randomが0以上9未満で実行 処理2条件:randomが(10以上)13未満で実行 …
Daregada

2021/03/05 14:09

「一定数」とは、おおよそどれくらいの数なのか。 具体的に、変数1,2,...に指定している数値は、どのくらいの範囲で、どのような形式の値を指定しているのか。 処理1や処理2で表示(?)を行なっているのはどのような内容か。 実際に、その現象が発生するコードを質問文に書くべきです。
Zuishin

2021/03/05 15:33

最後に else が無いからでは? if (~ else if (~ else if (~ else { alert(~
退会済みユーザー

退会済みユーザー

2021/03/05 15:41

仰る通りのミスはございましたが、訂正しても状態に変化は見られないようです。
Zuishin

2021/03/05 15:47

どうなれば正しい動作なのかが書いていないのでわかりません。
退会済みユーザー

退会済みユーザー

2021/03/05 15:58

条件分けをしているからには、条件に適合した場合は該当する処理を実行したいのです。全て二度のalertを確認したいところ、数字が大きくなると二度目のalert(各条件での処理)が確認できないため、頭を悩ませている次第です。
Daregada

2021/03/05 16:00

実際に何個ぐらい変数があって、「全体の1/3~1/2程度」って何個ぐらいなのか。
Zuishin

2021/03/05 16:00

二度目の alert が出るコードにはなっていません。else がどういうものか調べてみてください。KojiDoi さんの回答が正解のように見えます。
退会済みユーザー

退会済みユーザー

2021/03/05 16:15

恐縮ながら、elseに関しては、参照物の例を出していただけないと察せないかと存じます。
Zuishin

2021/03/05 16:23

else は「そうでないなら」という意味です。 if (a < 10) { alert("10 未満"); } else if (a < 20) { alert("10 以上 20 未満"); } この場合、a が 10 未満なら "10 未満" と alert がでます。 そして a が 10 以上 20 未満なら "10 以上 20 未満" と alert がでます。 そして次の場合は a が 10 未満なら "10 未満" と "20 未満" の二回の alert がでます。 10 以上 20 未満なら "20 未満" と alert がでます。 if (a < 10) { alert("10 未満"); } if (a < 20) { alert("20 未満"); }
退会済みユーザー

退会済みユーザー

2021/03/05 16:28

ありがとうございます。前者が意図する動作です。
Zuishin

2021/03/05 16:32

質問のコードでは乱数が 8 未満で "8" 乱数が 8 以上 15 未満で "15" 乱数が 15 以上 16 未満で "16" と、メッセージが出ます。確率はそれぞれ 8%, 7%, 1% で、84% は無反応です。alert が二回出る乱数はありません。
退会済みユーザー

退会済みユーザー

2021/03/05 16:58

number (+ 数値)の最高値は100です。これは書きそびれていたことです。しかしそれ以外のことは質問文に書いたことの繰り返しになるかと思います。複数回のやりとりを経たうえで感じたこととして、質問文の説明が伝わらなかったのなら申し訳なく思いますが、そうだとしたら、どの道現状の私には貴方が理解できる説明はできないように感じてきております。
Zuishin

2021/03/05 17:02

100 だから 84% が無反応になります。100 - 8 - 7 - 1 = 84 です。
退会済みユーザー

退会済みユーザー

2021/03/05 17:04

※質問文を読んで、よくわからなかった部分、想像した内容を具体的に教えていただけますと、より適切な質問文の作成に繋がるかもしれません。
Zuishin

2021/03/05 17:04

書き方を変えると、8 未満は 0 から 7 までの 8 つ、8 以上 15 未満は 8 から 14 までの 7 つ、15 以上 16 未満は 15 のみの 1 つ、それ以外は 16 から 99 までの 84 です。
Zuishin

2021/03/05 17:07

> ※質問文を読んで、よくわからなかった部分、想像した内容を具体的に教えていただけますと、より適切な質問文の作成に繋がるかもしれません。 あなたの思う「正しい動作」が書いていないのでわかりません。
退会済みユーザー

退会済みユーザー

2021/03/05 17:07

一つ前の投稿は返信確認前に投稿しました。具体例のご説明ありがとうございます。仰っている内容は理解しております。
退会済みユーザー

退会済みユーザー

2021/03/05 17:10

ご回答ありがとうございます。質問修正時の参考にさせていただきます。
Zuishin

2021/03/05 17:12

人をからかって遊んでるのかな?
Daregada

2021/03/05 17:19

「実際に使っているコード」をそのまま載せてください。 提示されているコードは(全角のMが混ざっていることからも推測されるように)実際に使っているものではなく、質問者が述べている現象は確認できません。
Zuishin

2021/03/06 00:08 編集

遊んでいるのでないとしたら、今のところどの回答者にも伝わっていないようなので、本気を出して説明してください。本気を出してそれが限界なら、融通のきかないコンピューターに逐一説明する行為であるプログラミングはあなたには厳しいですね。
退会済みユーザー

退会済みユーザー

2021/03/06 00:11

説明に関しては、私自身も先に書いている通りなのでこれ以上のコメントは控えます。後者に関しては、本題から逸れる内容の為返答しません。
otn

2021/03/06 00:48

実際に使っているコードのコピペも出来ないレベルだと言うことなのでしょうか?
guest

回答4

0

ベストアンサー

自己解決(原因特定の見込みなし)

投稿2021/03/18 08:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ここ飛び込むの勇気がいるなぁ…と思いつつ、

確率に偏りのあるランダムを使った条件分け処理を実現するために、Math.floor(Math.random()*100)で取得した内容を、数値0~99の間で範囲を区切った条件分けに使用する。

ガチャの確率を弄りたいとかかな?ガチャると☆1~☆4までがランダムで出るとか。

javascript

1const random = Math.floor(Math.random()*100) 2alert(random); 3 4const number1 = 8; 5const number2 = 15; 6const number3 = 16; 7 8if (random < number1) {alert(number1);} 9else if (random < number2) {alert(number2);} 10else if (random < number3) {alert(number3);} 11else {alert('out of numbers');}

疑問点

この現象が起こっている原因を知りたい。
条件の範囲で意図した動作が可能(な可能性がある)ならば、記述例を知りたい。

0~99までの数字が生成されて、
一度目のアラートで生成数字が表示される。

二度目のアラートではどの範囲に入ったか(ガチャなら☆いくつか)
0~7はnumber1、
8~14はnumber2、
15はnumber3、
16~99はout of numbers

これで解決でしょ?という質問にしか見えないので、質問者さんの質問の仕方に問題がありかなぁと。

以下蛇足です。
else if(条件)これは矛盾が生じない範囲であれば増やしても大丈夫なので、
30個まで増やしたいのであれば矛盾が出ないように数字を増やしていって下さいね。

投稿2021/03/06 04:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

alert(number1)が発生するのは、randomが8未満の場合。
alert(number2)が発生するのは、randomが8以上で、かつ、15未満の場合。
alert(number3)が発生するのは、randomが15以上で、かつ、16未満の場合。
ですが、これはあなたは意図した通りの動作なんでしょうか

#number3はrandom==15のときしか発生しませんな

投稿2021/03/05 22:58

y_waiwai

総合スコア88038

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

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

退会済みユーザー

退会済みユーザー

2021/03/05 23:56

意図した通りの動作です。number(+数値)はnumber30前後まであり、最大値は100です。定数の定義やelse if(最後はelse)は、それに伴って同等内容が続きます。else ifは1/3程度のみ意図通り動作します。 再現性についてご指摘がありますが、丸裸だと公開情報としては悩む部分があること、回答をいただいて記述上の明らかなミスが原因ではない可能性が高まったことから、解決の方向としては原因追及よりも別の記述方法の模索に進ませていただくと思います。
y_waiwai

2021/03/06 00:00

で、意図した通りの動作なら、それでよかったね、ということになりますね
退会済みユーザー

退会済みユーザー

2021/03/06 00:05

本来ならば全てのelse ifの処理が実行されて欲しいところが、実行されていないということです。
Zuishin

2021/03/06 00:12

されるわけがない。説明したと思うけど。
退会済みユーザー

退会済みユーザー

2021/03/06 00:17

他の回答も踏まえ、現状の私が回答者側に伝わる説明ができないと見受けられるため、自己解決に注力します。これ以上のコメントは原則差し控えます。
maisumakun

2021/03/06 00:21

> 本来ならば全てのelse ifの処理が実行されて欲しいところが elseである以上、ifの条件に一致したら対応するelse(else ifが連なっているのでそれ以降全ての条件)は実行されません。
guest

0

変数1による条件判定と変数2による条件判定を独立的に行ないたいという話であれば、else ifを使ってはダメですね。

if (random < 変数1) {処理1} if (random < 変数2) {処理2} ...

投稿2021/03/05 13:46

KojiDoi

総合スコア13692

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

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

退会済みユーザー

退会済みユーザー

2021/03/05 15:13

質問文を修正しました。修正済みの投稿をご覧になった上でifの方が適切だということであれば、可読性の問題なのか、動作上の問題なのか教えていただけますと有り難く存じます。
KojiDoi

2021/03/05 16:01

randomを乱数ではなく適当な定数に書き換えて、貴方の考える不適当な結果が我々にも再現できるようにしてください。現状ではあなたが何に納得できてないのかが分かりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問