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

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

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

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

Q&A

解決済

3回答

864閲覧

サイコロの出目 関数化 配列を使用

akoro

総合スコア27

PHP

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

0グッド

0クリップ

投稿2019/01/15 04:27

編集2019/01/15 06:50

■背景
PHP独学、初心者です。

■ここでの目標
① 以下の式(出目の集計結果)をもとに(出目の集計結果が合っていることを確認する意味も含めて)集計結果とは別に、出目を表示したい
② ①を関数化したい

$face=$_POST['face']; //サイコロの面の数 $num=$_POST['num']; //サイコロをふる回数 $roll=array_fill(1,$face,0); for($i=1;$i<=$num;$i++){ $dice=mt_rand(1,$face); $total=$roll[$dice]++; } foreach($roll as $key=>$val){ echo "{$key}:{$val}<br>\n"; }

■最終目標
元の式をベース(or配列をベースにした考えの式)に、⑴出目の表示⑵集計結果、それぞれを関数化したい

■試したこと
出目表示のみをさせることはできたが、元の式からの集計結果と連動できない

/** *サイコロのふる回数と面数に応じて、サイコロをふった結果を取得 *@param int $rollnum サイコロふる回数 *@param int $facenum サイコロの面数 *@return string $dicenum 結果の数字を文字列とし返す */ function dice2($rollnum,$facenum){ $dice=""; for($i=1;$i<=$rollnum;$i++){ $dicenum.=mt_rand(1,$facenum); } return $dicenum; }

表示はできたが、元の式の

$dicenum=mt_rand()%($facenum)+1; $total=$a[$dicenum]++;

が含まれていないため、集計結果との連携ができていない

関数化の作業にまだ不慣れで苦戦しています。
アドバイスいただけますと幸いです。

--追記--
回答ありがとうございます。
当方の知識不足(いただいた回答にでてくる公式を調べながら解読しようと試みるも全ては理解できていない)と質問の仕方が原因で、おそらく求めているものと少しずれている気がします。
もう一度質問の形をかえて質問させてください。

■目標
以下、ふたつの関数を連携させたい。
関数は独立したものに保ちたいが、結果を連携させたい。

それぞれの動作は確認済み、だが、完全に独立している

サイコロの出目を表示

*サイコロのふる回数と面数に応じて、サイコロを出目を表示 *@param int $facenum サイコロの面数 *@param int $rollnum サイコロふる回数 *@return string print 結果の数字を返す */ $face=$_POST['face']; //サイコロの面の数 $num=$_POST['num']; //サイコロをふる回数 function diceRoll($rollnum,$facenum){ for($i=1;$i<=$rollnum;$i++){ $dice=mt_rand(1,$facenum); print $dice; } }

サイコロの集計結果

*サイコロのふる回数と面数に応じて、サイコロをふった集計結果を表示 *@param int $facenum サイコロの面数 *@param int $rollnum サイコロふる回数 *@return string print 結果の数字を帰す */ function diceCount($rollnum,$facenum){ $arrayDice=array_fill(1,$facenum,0); for($i=1;$i<=$rollnum;$i++){ $dice=mt_rand(1,$facenum); $total=$arrayDice[$dice]++; } foreach($arrayDice as $key=>$val){ print "{$key}:{$val}<br>\n"; } }

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

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

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

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

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

yambejp

2019/01/15 04:31

前の質問を閉じてないのでそちらに続きで書くか、前の質問を閉じてください
akoro

2019/01/15 05:09 編集

連続でありがとうござます。 後だしで質問追加していくのはマナー違反になるかと思い別で作成しました、前のをしっかり閉じてから新しいの出すように心がけます。
m.ts10806

2019/01/15 04:52

ついた回答で更に突っ込んで聞きたい場合はその回答者に聞いていくのはありと思います。大きな要件追加でなければ。
akoro

2019/01/15 05:10

かしこまりました、次回から意識します。ありがとうございます。
guest

回答3

0

ベストアンサー

表示はできたが、元の式の

$dicenum=mt_rand()%($facenum)+1;
$total=$a[$dicenum]++;
が含まれていないため、集計結果との連携ができていない

のところが分からないです(そういう元の式はないです)

(mts10806様の回答に似てるんですが、意図が違うので)
私は、データ構造の問題だと思って回答しています。

array_count_valuesに拘ってるみたいにみえるかもしれませんが、出目の結果を出すとか、集計するとか(機能拡張を想定すれば、平均=期待値出すとかも出てくると思います)っていうことがもっともやりやすいデータ構造って何だって話で、これまでの質問履歴からすると、出目の履歴が数値の配列になっていればいいと思うのです。

dice2で文字列にするっていうのが集計などを考えると実にハンドリングしにくいです(str_splitすれば配列になりますが、そもそも文字化しなきゃいい)
最初に6が出たのが何回目とかっていう機能拡張なら文字列でもいいですが、最初に奇数が出たのが何回目とかってなると、数値の配列がいいように思います。基本的に、数と認識される出目を文字にしているのがおかしい気がします。

php

1<?php 2$trialResult = trialOfNdiceRollOfM(6, 100); 3$hindo_shukei = array_count_values($trialResult); 4$roku_ga_deta_kaisu = $hindo_shukei[6] ?? 0; 5$deme_no_goukei = array_sum($trialResult); 6$heikin = $deme_no_goukei / 100; 7echo "$roku_ga_deta_kaisu $deme_no_goukei $heikin".PHP_EOL; 8echo "でた目は順に".PHP_EOL.implode(PHP_EOL, $trialResult); 9 10function trialOfNdiceRollOfM(int $n, int $m) { 11 $ret = []; 12 while($m) { 13 $ret[] = mt_rand(1, $n); 14 $m--; 15 } 16 return $ret; 17}

投稿2019/01/15 05:20

papinianus

総合スコア12705

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

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

akoro

2019/01/15 08:49

変数の名前、分かりやすくつけていただいて助かりました。 時間かけてやっとあらかた理解しました。説明もありがとうございます。 技術不足故に、数字として出目を表示はできても、その後の集計に利用できませんでした。 文字列として設定したところsubstr_countを利用してうまく集計がとれたので、その名残でずっと文字列で考えようとしていました。回答いただいたものを見て、確かに文字列はハンドリングしにくと思えました。 新しい知識をありがとうございます。
papinianus

2019/01/15 08:55

蛇足もいいところですが、配列と仲良くなってください。配列はデータを処理していくうえで基本なのと、とくにphpは配列を操作する便利な標準関数がそれなりにある(https://secure.php.net/manual/ja/ref.array.php)ので。
akoro

2019/01/15 09:01

URLもありがとうございます。まだ使いこなせないものがほとんどなので教本やマニュアルみながら取り組んでみます。
guest

0

やりたいことがこれでいいかわからないですが、
配列に保管しておいて配列をreturnすれば良いのでは。

php

1function dice2($rollnum,$facenum){ 2 $result = []; 3 $result["count"] = array_fill(1,$facenum,0); 4 5 for($i=1;$i<=$rollnum;$i++){ 6 $dice=mt_rand(1,$facenum); 7 $result["history"][] = $dice; //出目履歴 8 $result["count"][$dice]++; 9 } 10 return $result; 11} 12 13var_dump(dice2(10,6)); 14/* 出力結果例 15array(2) { 16 ["count"]=> 17 array(6) { 18 [1]=> 19 int(2) 20 [2]=> 21 int(2) 22 [3]=> 23 int(2) 24 [4]=> 25 int(1) 26 [5]=> 27 int(1) 28 [6]=> 29 int(2) 30 } 31 ["history"]=> 32 array(10) { 33 [0]=> 34 int(2) 35 [1]=> 36 int(6) 37 [2]=> 38 int(6) 39 [3]=> 40 int(1) 41 [4]=> 42 int(1) 43 [5]=> 44 int(5) 45 [6]=> 46 int(3) 47 [7]=> 48 int(4) 49 [8]=> 50 int(2) 51 [9]=> 52 int(3) 53 } 54} 55*/

細かくて申し訳ないですが、文章的には「n面のサイコロをnn回振る」としたほうが自然なので、関数の引数は逆の方がいいかなと。

投稿2019/01/15 04:51

m.ts10806

総合スコア80850

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

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

akoro

2019/01/15 05:34

作動しました。 historyとcountはこういう使い方ができるんですね、大変勉強になります。 関数の引数に関してのアドバイスもありがとうございます、文章の順番にそって書くように致します、
m.ts10806

2019/01/15 05:55

こちらが勝手に定義したものなので使い方は自分で決めます。 単に複数の情報を返すために配列が都合が良かっただけで、やり方はこれだけではありません。
akoro

2019/01/15 08:40

ご丁寧にありがとうございます。 当方の検索能力が低い故に、返信が遅いうえに低レベルで申し訳ないのですが、 ``` $result["history"][] = $dice; $result["count"][$dice]++; ``` このふたつのように[]が二つ付けられるような式に特別な名称などはあるのでしょうか?
papinianus

2019/01/15 08:53

「2次元配列」ですかね、2つに限定されません。何個でもいいです(3つ以上は複雑になりすぎるのであまりやりませんが、3次元座標だと3つくらいはあってもおかしくないですね) 2つまでは表形式のデータで使うのでプログラムでは頻出です。
akoro

2019/01/15 08:58

助かります、検索できました。勉強します。
m.ts10806

2019/01/15 09:01

papinianusさん 補足ありがとうございます。 akoroさん 最初のうちは処理中の配列に何が入っているか把握しづらいかと思いますので、まずは理想の出力系を作っておき(スタブと言います)、その形を目指して行くと良いです。 途中でvar_dump()で変数の中身を確認すると良いですよ
akoro

2019/01/15 09:04

アドバイスありがとうございあます、意識してやってみます。
guest

0

サイコロを振ったタイミングで出目を表示するのはこう

PHP

1for($i=1;$i<=$num;$i++){ 2 $dice=mt_rand(1,$face); 3 print $dice."<br>"; 4 $roll[$dice]++; 5}

前回の記述もおかしかったですが$total再利用されていない変数なので
意味がありません

投稿2019/01/15 04:37

yambejp

総合スコア114775

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

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

akoro

2019/01/15 06:38

ありがとうございます、たしかに出目の表示だけなら$total不必要でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問