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

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

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

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

Q&A

解決済

2回答

4272閲覧

コインを100回投げて、表か裏が10回連続で出る確率

siftshift

総合スコア3

Python

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

0グッド

0クリップ

投稿2019/08/11 08:28

コインの確率

Pythonを使ってコインを100回投げて、表か裏が10回連続で出る確率を求めています。
アプローチとして
① 
1,乱数で1か2を出す
2,文字列としてtotalについかする。
3、それをWhileで100回繰り返す。
→100桁の1か2で構成された文字列を得ることができる。

1、if in でその文字列の中に1か2が10回連続している箇所があるか調べる。
2、あればcount_timesに1を加える。なければ何もしない

①、②を”任意の数”繰り返す

最後にcount_timesの値を”任意の数”で割る。
値を出す

というアプローチで解こうとしています。

import random

count = 0
total = ""
number = "1111111111"
number_two = "2222222222"
count_times = 0
count_what = 0
result = 0

while count_what < 100:

while count < 100: coin = random.randint(1,2) if coin == 1: total += ("1") count += 1 elif coin == 2: total += ("2") count += 1 else: count = 0 count_what += 1 if total in number or total in number_two: count_times += 1 total = "" else: total = "" result == count_times // 100 print(result)

しかし値が出ません。

ご回答よろしくおねがいします。

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

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

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

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

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

coco_bauer

2019/08/11 08:49

pythonのプログラムのコードは、インデンテーション(字下げ)によって、ブロックを区別します。質問に書かれたような字下げがまったくされていないコードでは、動作が判りません。 正しいPythonのコード(ちゃんと字下げされたコード)を質問に書いてください。
guest

回答2

0

ベストアンサー

python

1import random 2 3number = "1111111111" 4number_two = "2222222222" 5count_times = 0 6count_what = 0 7result = 0 8 9while count_what < 100: 10 count = 0 11 total = "" 12 while count < 100: 13 coin = random.randint(1,2) 14 if coin == 1: 15 total += ("1") 16 elif coin == 2: 17 total += ("2") 18 count += 1 19 20 if number in total or number_two in total: 21 count_times += 1.0 22 count_what += 1 23 24result = count_times / 100 25print(result)

元のソースif total in number or total in number_two:だとnumberの中にtotalになってしまいます。ここは英語の意味どおりで。

元のソースresult == count_times // 100だと

  • 代入は==ではなく=
  • 小数点の計算をしたいときは//ではなく/

短くしてみた

python

1import random 2 3one = "1"*10 4two = "2"*10 5count_times = 0 6 7for _ in range(100): 8 total = ''.join([str(random.randint(1,2)) for _ in range(100)]) 9 count_times += (total.count(one)+total.count(two)+1)//2 10 11result = count_times / 100 12print(result)

投稿2019/08/11 09:22

編集2019/08/11 10:04
NCC1701

総合スコア1680

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

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

0

「1、if in でその文字列の中に1か2が10回連続している箇所があるか調べる」のところのコードで、in演算子の使い方を間違えています。

pythonのin演算子は、
```ここに言語を入力
'対象の文字列' in '対象の文字列が含まれているかもしれない文字列'

というように使います。 ```ここに言語を入力 '1' in '2222222222'

は、'1'が'22222222'に含まれていないのでFALSEになります。

'2' in '2222222222'

は、'2'が'2222222222'に含まれているのでTRUEになります。

なので、「if in でその文字列の中に1か2が10回連続している箇所があるか調べる」のであれば、

if (number in total) or (number_two in total):

となるはずです。

ところが、質問のコードでは

if total in number or total in number_two:

と探す文字列と、それが探される文字列が逆になっています。
これでは、最初の10回で1が連続して出るか、最初の10回で2が連続して出るか、いずれかでなければ、このIF文の条件が満たされません。(最初の10回で1か2が連続する可能性は、1/512 (約0.195%)なので、変数count_timesの値が1以上になる可能性は低いです。
それを100で切り捨て除算した結果は0にしかなりません。
これが、「しかし値が出ません」の原因です。

投稿2019/08/11 09:34

coco_bauer

総合スコア6915

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問