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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

6437閲覧

確率によるデータの取得について

melon910

総合スコア35

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/10/18 08:53

編集2016/10/18 09:33

プログラムの確率によるデータ取得について質問です。
現在、制作しようとしているプログラムは、登録フォームを作りデータを登録し、その登録したデータにパーセントを設定できるようにし、設定したパーセントにより表示する確率を変動させたいと考えています。

こちらの考えとしては、
例えば、登録データ「A」「B」「C」「D」とあり、それぞれの確率が「A(36%)」「B(21%)」「C(18%)」「D(25%)」と設定されているとします。
※小数点以下は表示しないものとします。

まず、それぞれの登録されたパーセントを取得し、そのパーセントに応じた分、データ(名称やナンバーなど)を生成させます。

例) 「A」であれば「36%」なので、「A」を36個生成します。

//「A」の場合 $val = array(); $count = "設定したパーセント(36)"; for ($i=1;$i<=$count;$i++) { $val[] = "データ(A)"; } //結果 //「$val」の中に「A」が36個格納されます。

これを、全ての登録データで行い、計100個格納されることになると思います。
そのデータが格納された変数からランダムで任意の個数取得すればよいので、

//shuffle($val); 偏りを軽減するため $rand = array_rand($val, "任意の数");

このようにすれば、「A」は「36%」の確率でデータを取得できると思います。
そして、ランダムで取得したデータをデータベースから呼び出し、表示すればよいと考えています。

ですが、このやり方以外に良い案があればと思い、質問させていただきました。
宜しくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/10/18 09:06

確率と確立が混在しているので見直しお願いします。紛らわしいので。
melon910

2016/10/18 09:10

すみません、誤字を修正しました。
退会済みユーザー

退会済みユーザー

2016/10/18 09:19

確率の数字が整数値であることを保証しますか? また、乱数は当然擬似乱数のため一定の偏りがありうるものですが。 array_rand()前にshuffle()するのもすこしは偏りを省けるかもしれません。
melon910

2016/10/18 09:35

確率の数字は登録する際に整数でないとエラーを出すか登録できないようにしようと考えていますので、整数の保証はできます。また、「array_rand()」について、偏りがありえるのですね・・・。一応、shuffleの記載を追加しました。ご指摘ありがとうございます。
guest

回答3

0

口数での抽選と同じ考えでいけるかと。
http://oshiete.goo.ne.jp/qa/52110.html

このサイトの回答では、2つのやり方がありますが、2つ目のナンバーリング法がコード化しやすいでしょうね。
1~100の範囲(実際には各ページに割り当てている確率の合計)から乱数を決定。
質問例で言えば、1~36だったらA、37~57ならB、という具合に振り分ければ良いと思います。

php

1<?php 2$pages = ["A" => 36, "B" => 21, "C" => 18, "D" => 25]; 3$sum = 0; 4foreach($pages as $k => $v){ 5 $sum = $sum + $v; 6 $num[$k] = $sum; 7} 8$r = mt_rand(1, $sum); 9foreach($num as $k => $v){ 10 if($r <= $v){ 11 $page = $k; 12 break; 13 } 14} 15echo $page; 16?>

投稿2016/10/19 00:53

ttyp03

総合スコア16996

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

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

melon910

2016/10/19 06:25

詳しいご説明ありがとうございます。自分一人の頭では考え付きませんでした。ご参考にさせていただきます。
guest

0

ベストアンサー

こんな感じでどうでしょう。

php

1// キーに文字、値に確率を持つ連想配列 2$weights = ["A" => 36, "B" => 21, "C" => 18, "D" => 25]; 3 4// 抽選関数 5$raffle = function($weights){ 6 $val = mt_rand(0, array_sum($weights)); 7 $tmp = 0; 8 foreach($weights as $k => $v){ 9 $tmp += $v; 10 if($val <= $tmp){ 11 return $k; 12 } 13 } 14}; 15// 実行 16var_dump($raffle($weights)); 17 18# 以下はテスト用(10万回抽選) 19$ret = ["A" => 0, "B" => 0, "C" => 0, "D" => 0]; 20for($i=0; $i < 100000; $i++){ 21 $ret[$raffle($weights)]++; 22} 23var_dump($ret);

投稿2016/10/18 16:46

kanohisa

総合スコア32

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

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

melon910

2016/10/19 06:26

全体的にまとまったプログラムとなってましたので、ベストアンサーとさせていただきました。ありがとうございました。
guest

0

1. A〜Dの確率を合計。それをsumとします
2. 1〜sumのレンジで乱数を生成。rとします
3. 確定処理(1回分)

3のロジックイメージ

if ( r <= Aの確率 ) { Aに決定 } else if ( (r - Aの確率) <= Bの確率 ) { Bに決定 } else if ( (r - Aの確率 - Bの確率) <= Cの確率 ) { Cに決定 } else { Dに決定 }

投稿2016/10/18 09:38

編集2016/10/18 09:59
fromageblanc

総合スコア2724

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

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

melon910

2016/10/19 06:27

条件分岐のやり方も考えに無かったので、ご参考になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問