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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1340閲覧

Pythonのカウンター設定の方法

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/19 18:52

編集2020/06/19 23:58

Pythonのカウンター設定の方法がよくわかりません。
コイントスをしてどちらが勝つかというゲームを繰り返し、勝率を出すためにカウンターで勝った回数を数えなくてはなりません。
どっちが勝つというところまではできたのですが、最後のゲームを繰り返して勝率をだすというところでうまくいきません。
10回やってHが数回勝っているのに、0になり、カウンターが更新されません。
お分かりになるかた、確認と修正よろしくお願いします。
いろいろ余計なものもがはいっていたり、確認のためプリントしたりしているのでわかりにくいかもしれません。
伺いたいのは最後のCountの部分となります。
よろしくお願いします。

from random import randrange def toss(): if randrange(2) == 0: return "head" else: return "tail" #simulate tossing a coin n times, and report the results def tossGame(Hmoney,Tmoney): tailCount = 0 headCount = 0 HwinCount = 0 TwinCount = 0 i=1 while i > 0: coin = toss() ## toss the coin here if coin == "head": # use the result once here headCount = headCount + 1 Hmoney = Hmoney +1 Tmoney = Tmoney -1 # print("head :", "H has $",Hmoney, "T has $",Tmoney) if Tmoney == 0: break # return HwinCount if coin == 'tail': # use the same result again here tailCount = tailCount + 1 Hmoney = Hmoney -1 Tmoney = Tmoney +1 # print("tail :", "H has $",Hmoney, "T has $",Tmoney) if Hmoney == 0: break # return TwinCount i = i + 1 if Tmoney == 0: HwinCount += 1 print ("H won!", HwinCount) else: TwinCount +=1 print ("T won!", TwinCount) print ("In", i,"tosses of a coin, there were",headCount, \ "heads and",tailCount,"tails.") #### repeat trial and report the probability def ProbHwin(Hmoney,Tmoney,nGames): Count = 0 for index in range(nGames): tossGame(Hmoney,Tmoney) if Tmoney == 0: Count += 1 average = Count/ nGames print (Count, avetage, nGames) ProbHwin(11,9,10)

`

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

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

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

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

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

guest

回答2

0

ベストアンサー

関数に渡す変数(ここではHmoney, Tmoney)は関数の中で値を変更しても呼び出し元の値は変化しないです。したがって関数の最後で変化した値を返す必要があります。

python

1def tossGame(Hmoney,Tmoney): 2 ... 3 return Hmoney, Tmoney # 呼び出し元で更新されないので関数の最後で値を返す必要がある

呼び出し元の方では

python

1for index in range(nGames): 2 Hmoney, Tmoney = tossGame(Hmoney, Tmoney) # 呼び出し元では結果を受け取る必要がある 3 ...

今回のような呼び出し元の値が変更されない渡し方を値渡し、逆に値が変更される渡し方を参照渡しと呼びます。ややこしいのは、普通の変数は値渡しで、辞書型やクラスのインスタンスは参照渡しになるということです (Pythonでは参照渡しはないとLouiS0616さんに指摘を頂きましたので修正します ※1参照)。

※1 出力引数のある関数 (参照渡し) はどのように書きますか?

投稿2020/06/19 20:48

編集2020/06/20 03:11
yymmt

総合スコア1615

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

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

退会済みユーザー

退会済みユーザー

2020/06/19 23:36

ありがとうございます。returnの使い方はそうするのですね。 ただ、確かにHの勝ち数は変化しますが、この関数を数回走らせると結果がなんかおかしくなります。TもHも同じ回数とtossをして10回Hがかつ、次はTが10回勝つが繰り返されるようです。 どこかでリセットみたいなことが必要でしょうか? 結果印刷している上のプリント文がこんな感じです。 H won! 1 In 21 tosses of a coin, there were 15 heads and 6 tails. H won! 1 In 2 tosses of a coin, there were 1 heads and 1 tails. H won! 1 In 13048 tosses of a coin, there were 6524 heads and 6524 tails. H won! 1 In 7526 tosses of a coin, there were 3763 heads and 3763 tails. H won! 1 In 4 tosses of a coin, there were 2 heads and 2 tails.
yymmt

2020/06/20 00:08 編集

なんども修正してすいません。リセットすれば良いです。 def ProbHwin(Hmoney,Tmoney,nGames) としている箇所を def ProbHwin(Hmoney_start,Tmoney_start,nGames)のように変更して Hmoney, Tmoney = tossGame(Hmoney,Tmoney) の呼び出し箇所を Hmoney, Tmoney = tossGame(Hmoney_start,Tmoney_start) として初期化すれば良いです。
退会済みユーザー

退会済みユーザー

2020/06/20 00:17

いえいえとんでもございません。こちらこそなにもわかっていないため、なにがおかしいのかもよくわからずすみません。 こまかくてすみません。 return Hmoney, Tmoney をReturn Tmoney ==0 といれかえ、 ProbHwinのfor rangeの下を差し替えてみました。 繰り返してもそれなりのばらける数値になるので問題ないように思いますが、これでいいのでしょうか? いろいろすみません。 H_winのときカウント増やすのはよくわかります。 return Tmoney == 0 を戻り値にするというのは、Hか勝ったときだけを次に渡すということになるのでしょうか? うまくいえないのですが、Tmoney==0はどこにそれが反映されているのかが今一つわからないです。 ご教示いただけると嬉しいです。
退会済みユーザー

退会済みユーザー

2020/06/20 00:19

すみません、話が前後してしまいました。 リセットをどうするのかこれから試してみます。 なんどもありがとうございます。
退会済みユーザー

退会済みユーザー

2020/06/20 00:27

ありがとうございました。 定義をかえたら何度か繰り返しても問題なく動くようになりました。 ただ、これだと初期化され、前のままだとどうしてだめなのかが今一つよくわかりません。 お時間が許す範囲でかまいませんので、お教えいただけると助かります。
yymmt

2020/06/20 00:48

forループを分解すると分かりやすいと思います。前のバージョンは Hmoney, Tmoney = tossGame(Hmoney, Tmoney) Hmoney, Tmoney = tossGame(Hmoney, Tmoney) # 前回の値を引き継ぐ Hmoney, Tmoney = tossGame(Hmoney, Tmoney) # 前回の値を引き継ぐ ... ですが新しいバージョンは Hmoney, Tmoney = tossGame(Hmoney_start, Tmoney_start) Hmoney, Tmoney = tossGame(Hmoney_start, Tmoney_start) # 前回の値Hmoney,Tmoneyを引き継がない Hmoney, Tmoney = tossGame(Hmoney_start, Tmoney_start) # 前回の値Hmoney,Tmoneyを引き継がない ...
退会済みユーザー

退会済みユーザー

2020/06/20 01:07

ありがとうございます。ループのあとの結果をプリントしてみてよくわかりました。 最初に設定した金額がその都度セットされなくてはならないところ、ただのHmoneyとTmoneyにしてしまうと20,0 が初期値となってしまうということなのですね。 よくわかりました。なんどもありがとうございました。大変助かりました。 またよろしくお願いします。
退会済みユーザー

退会済みユーザー

2020/06/20 02:04

何度も申し訳ございません。初期化の件はよくわかったのですが、いま問われていることをよく読んだら、最初の関数tossGame()ではreturn the winner of the gameとなっていました。 ということは先にご指摘いただいた、勝者をreturnに指定するということですよね。 return Tmoney == 0 ということはHが勝っているということなので、勝者をreturnしていることになるとは思うのですが、Tが勝った時も考慮しなくてはならないように思い、また混乱しております。 Hが勝った時というより、勝者をreturnした場合、また次の関数もかわってくるようですが、どうすればよいのかご教示いただけますでしょうか。すみません。本当に何度も。
yymmt

2020/06/20 02:16

プログラミングを作る際、やはり仕様から入るのが良いと思います。 def tossGame(Hmoney,Tmoney): winner = "T" return winner みたいな形でまず作ります。中身の実装は後で考えます。 集計の方では for index in range(nGames): winner = tossGame(Hmoney,Tmoney) if winner == "T": Count += 1 average = Count/ nGames とするだけです。
退会済みユーザー

退会済みユーザー

2020/06/20 02:25

ありがとうございます。 最終的に出さなくてはならないものはHの勝率なので、先ほどお教えいただいたコードでそれはでます。 ただ、意味的に勝者を返すとなっていたので、確かにおっしゃるとおりwinnerというのを作るのがいいのかもしれません。 winner はHとTがいて、Hがwinnerならとすればいいということですよね。 自分でも考えてみますが、よろしくお願いします。
LouiS0616

2020/06/20 02:50 編集

横やりすみません。 @yymmt さん > ややこしいのは、普通の変数は値渡しで、辞書型やクラスのインスタンスは参照渡しになるということです。 いいえ。少なくともPythonでは変数の型に依って渡し方が異なることはありません。
yymmt

2020/06/20 02:53

あれ、そうでしたっけ・・・。 >>> a = {} >>> a["abc"] = 10 >>> def f(b): ... b["abc"] = 20 ... >>> f(a) >>> a {'abc': 20} うーん・・・。
LouiS0616

2020/06/20 03:05 編集

間違っている点が二つあります。 ・ 『普通の変数』はint型などを指しているのだと思いますが、これらはイミュータブルなので値を変更する方法が無いだけです。渡し方は同じです。 ・ リストや辞書などの値が関数内で変更できるのは、参照渡しとは関係ありません。
yymmt

2020/06/20 03:04

よく理解できました。FAQもたまには読まないとダメですね。本文の方は訂正しておきます。
退会済みユーザー

退会済みユーザー

2020/06/20 05:22

色々ありがとうごいました。 エラーもなくなり、なんとかよさそうな感じでループするようになりました。 何度もすみませんでした。 また、いろいろと貴重な情報をお教えいただきありがとうございました。 今後の参考にさせていただきます。
guest

0

Python

1def ProbHwin(Hmoney,Tmoney,nGames): 2 Count = 0 3 for index in range(nGames): 4 tossGame(Hmoney,Tmoney) 5 if Tmoney == 0: 6 Count += 1 7 average = Count/ nGames 8 print (Count, nGames, nGames) 9ProbHwin(11,9,10) 10```これだけ見ると、まず最初`Count = 0`で`Count`は0で、`Tmoney == 0`がFalseなのでそのまま`Count`は0になります。 11```Python 12def ProbHwin(Hmoney,Tmoney,nGames): 13 Count = 0 14 # 0 15 for index in range(nGames): 16 tossGame(Hmoney,Tmoney) 17 if Tmoney == 0: 18 Count += 1 19 # Tmoneyが11なので、if文を通らず、0 20 # 0 21 average = Count/ nGames 22 # 0 23 print (Count, nGames, nGames) 24ProbHwin(11,9,10) 25```ゼロのままです。

投稿2020/06/19 20:23

編集2020/06/19 20:24
ForestSeo

総合スコア2720

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問