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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

2299閲覧

JavaScriptでランダムかつ優先度を設定して値を複数取得する方法

alfa

総合スコア12

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2017/02/16 11:35

JavaScriptでランダムかつそれぞれの値に表示される確率を設定して値を複数取得できる手段を教えて頂きたいです。

<input type="text" id="category1" value="あいうえお"> <input type="text" id="category2" value="かきくけこ"> <input type="text" id="category3" value="さしすせそ"> <input type="text" id="category4" value="なにぬねの"> <input type="text" id="category5" value="はひふへほ"> <input type="text" id="category6" value="まみむめも"> <input type="text" id="category7" value="やゆよ"> <input type="text" id="category8" value="らりるれろ"> <input type="text" id="category9" value="わをん">

例えば、イメージとして上記に入力された9つの値の中からランダムで2つ取得するときに、取得される確率をcategory1,category2を70%、category3,category4を50%、category5を30%、それ以外は20%と設定し、ランダムで優先順位をもちながら2つ値を取得といった感じです。
これをJSで実装したいです。

よろしくお願いします

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

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

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

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

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

Lhankor_Mhy

2017/02/16 11:52

ご提示の確率は合計100%超えていると思うのですが、何に対しての確率でしょうか。また、優先順位とはどのように定義されていますか?
alfa

2017/02/16 12:47

確かにご指摘のとおり、何に対する確率かの明記が不十分でした。イメージとしてはcategory1~9を順番に見て行って、表示するかしないかを選択するとき70%の確率で表示し、30%の確率で表示しない、これをcategory3では表示する確率50%、しない確率50%といったように最後までみていくイメージでした。これが上記での確率のイメージで、優先順位とは確率の高い先述の確率が高いほど二つ取得されるうちの1つに入るというイメージです。しかしそもそも表題の処理を実装したいときにもっといい手段がないとも言えない気がするので、ほかの方法でアイデアがあった場合も頂きたいです。宜しくお願いします。
yambejp

2017/02/16 14:34

つまりそれぞれのカテゴリは他に影響されず、自らの指定された確率で表示をしたりしなかったりするのですね?場合によっては表示が1個もなかったり、9個全部が表示されてもよいということで?
alfa

2017/02/17 00:13

上記の例で行くと、9個のうち2個をランダムで取ってくるイメージです。その出力される2個を選ぶのにさらに優先順位をつけたいといった感じです。
masaya_ohashi

2017/02/17 00:20

その優先順位は絶対なのでしょうか?1〜9まで全部ヒットしてしまって9個当たりが出たとしても、表示するのは「必ず」優先順位で上から1と2のものだけですか?
Lhankor_Mhy

2017/02/17 00:20

低い確率ですが0個あるいは1個しか選択されないことがありうると思いますが、その時は不足のままでいいですか?
alfa

2017/02/17 00:38

優先順位に関しては絶対表示するのではなく、あくまで表示される確率が高くなるという意味での優先順位を想定しています。
alfa

2017/02/17 00:39

もし仮に0~1個になった場合でも大丈夫です。
masaya_ohashi

2017/02/17 00:48

>あくまで表示される確率が高くなる それならば優先順位にも確率を付けていただかないと仕様が足りないかと思います。
think49

2017/02/17 09:40

「9つの値の中からランダムで2つ取得する」とありますが、要件をまとめると「ランダムで0~9個表示する」になっていて矛盾があるように思われます。
alfa

2017/02/17 14:47

仕様の伝え方が曖昧だった点申し訳ありませんでした。。。こちらの件ひとまずベストアンサーに選ばせて頂いたもので解決しました。
guest

回答3

0

ベストアンサー

正直なところ仕様がふわふわしすぎているので正解なんてないと思います。が、私なりにこれは「モンスターが落とすドロップアイテムの仕組み」なのではないかと解釈して、こうまとめました。

  • モンスターが落とすアイテムの種類が9種類ある
  • モンスターは同時に最大2個しかアイテムを落とさない
  • 9種類のアイテムにはそれぞれ「落ちるか落ちないか」の確率が設定されている
  • 1匹倒すごとに9種類のアイテムそれぞれが「落ちるか落ちないか」の判定がされる
  • 3種類以上当たってしまった場合、「もともと設定されている確率が一番高いもの」が優先的に1個確定し、もう1個は?????

このもう1個の部分をどうするかがいまのところはっきりしていませんので、単純に等分の確率で選べばいいのではないでしょうか。

https://jsfiddle.net/2zo2s8g0/1/

HTML

1<button id="lotteryButton"> 2抽選 3</button> 4<h3> 5ひとまず全部抽選 6</h3> 7<div id="pickups"> 8 9</div> 10<h3> 11優先度によって2個まで削減したもの 12</h3> 13<div id="output"> 14 15</div>

JavaScript

1var table = [ 2 {categoryName:"category1", percentage:70, value:"あいうえお"}, 3 {categoryName:"category2", percentage:70, value:"かきくけこ"}, 4 {categoryName:"category3", percentage:50, value:"さしすせそ"}, 5 {categoryName:"category4", percentage:50, value:"なにぬねの"}, 6 {categoryName:"category5", percentage:30, value:"はひふへほ"}, 7 {categoryName:"category6", percentage:20, value:"まみむめも"}, 8 {categoryName:"category7", percentage:20, value:"やゆよ"}, 9 {categoryName:"category8", percentage:20, value:"らりるれろ"}, 10 {categoryName:"category9", percentage:20, value:"わをん"} 11]; 12function lottery() { 13 document.getElementById("pickups").innerHTML = ""; 14 document.getElementById("output").innerHTML = ""; 15 var pickup = []; 16 for(var index in table) { 17 var data = table[index]; 18 if(data.percentage > Math.random() * 100) { 19 // あたり 20 pickup.push(data.value); 21 document.getElementById("pickups").innerHTML += data.value + "<br>"; 22 } 23 } 24 if(pickup.length > 2) { 25 pickup = [pickup[0], pickup[Math.floor(Math.random() * (pickup.length - 1)) + 1]]; 26 } 27 for(var index in pickup) { 28 document.getElementById("output").innerHTML += pickup[index] + "<br>"; 29 } 30} 31 32document.getElementById("lotteryButton").addEventListener("click", lottery);

投稿2017/02/17 01:14

編集2017/02/17 01:24
masaya_ohashi

総合スコア9206

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

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

alfa

2017/02/17 14:48

ありがとうございます!
guest

0

一応、ご希望の仕様どおり書いてみましたが、これでよろしいでしょうか。

javascript

1var settings = [ 2 {"id":"category1", ratio:0.7}, 3 {"id":"category2", ratio:0.7}, 4 {"id":"category3", ratio:0.5}, 5 {"id":"category4", ratio:0.5}, 6 {"id":"category5", ratio:0.3}, 7 {"id":"category6", ratio:0.2}, 8 {"id":"category7", ratio:0.2}, 9 {"id":"category8", ratio:0.2}, 10 {"id":"category9", ratio:0.2}, 11]; 12console.log( 13 settings.filter( 14 e => e.ratio > Math.random() 15 ).slice( 0, 2 ).map( 16 e => document.getElementById(e.id).value 17 ) 18);

投稿2017/02/17 08:18

編集2017/02/17 08:30
Lhankor_Mhy

総合スコア35869

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

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

alfa

2017/02/17 14:48

ありがとうございます!
guest

0

9個中2個えらぶならパーセントという表記はおかしいと思います。
category1~9までたんに7:7:5:5:3:2:2:2:2で表示すればいいのですね?
であれば合計35ですからそれぞれの値の範囲をきめることは可能です。
1つ目の値を取った後残りの値の比率をもとに再抽選すればよいでしょう

投稿2017/02/17 00:20

yambejp

総合スコア114583

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

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

alfa

2017/02/17 14:48

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問