小ネタです。
何せ、3月初頭までパソコン壊れてたんで、知る機会が無かったんですよねぇ。残念。
さて、ちと問題を読み替えてみます。
単純に確率p=0.5で出る「ドコ」を成功、「ズン」を失敗として捉えると「ズンズンズンズンドコ」と言う文字列が出現する確率は
なお、問題の要請としては、例えば一回「失敗」が多い
の後でも「キ・ヨ・シ!」が出ても良い模様です。
つまり、この場合、文字列が要素「ズン」と「ドコ」の複合体と見た場合、5つ以上の長さの場合「キ・ヨ・シ!」を繋げる、そうじゃない場合はそのまま出力する、と言う問題として読み替える事が出来るのです。
ちなみに、こういう「失敗を何度か続けた後に成功する」と言う確率分布モデルがあって、それを幾何分布と言います。
上の写真で言うと、Number of Failures until Success(成功するまでの失敗の数)が4以上の時に「キ・ヨ・シ!」を出力してそれより小さい場合は「キ・ヨ・シ!」を出力しなければ題意が満たせます。
さて、このロジックでプログラムを実装しますが、使用する言語はPython(2.7)、あとは幾何分布に従う確率変数を用いる為、Numpyを利用します。
一応、マイブームなんで、問題の要件とは若干違いますが、ジェネレータで実装しています(笑)。
次のようにして遊びます。
これがなかなか、目的の文字列が出ないんですよね(笑)。
ちなみに、フツーに実装しようが、今回みたいに幾何分布を利用して実装しようが結果は(理論的には)変わりません。
基本的に「ズンズンズンズンドコ キ・ヨ・シ!」が成立する確率は計算上、これ以上に「ズン」の部分が長い文字列の場合と合わせて、実は6.25%しかなく、反面、「ズン」の連続が4回に満たない文字列の出現確率は93.75%もあります。
つまり、このジェネレータを回しても10回に1回は出ない、って事なんですね。
クソ、面白いネタなんだけど、知らんかった(笑)。Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから— てくも (@kumiromilk) March 9, 2016
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
何せ、3月初頭までパソコン壊れてたんで、知る機会が無かったんですよねぇ。残念。
さて、ちと問題を読み替えてみます。
単純に確率p=0.5で出る「ドコ」を成功、「ズン」を失敗として捉えると「ズンズンズンズンドコ」と言う文字列が出現する確率は
失敗×失敗×失敗×失敗×成功 = 0.5×0.5×0.5×0.5×0.5 = 3.125%になります。そしてこの文字列が出現した「後」に「キ・ヨ・シ!」を繋げてやれば良い。
なお、問題の要請としては、例えば一回「失敗」が多い
ズンズンズンズンズンドコ
の後でも「キ・ヨ・シ!」が出ても良い模様です。
つまり、この場合、文字列が要素「ズン」と「ドコ」の複合体と見た場合、5つ以上の長さの場合「キ・ヨ・シ!」を繋げる、そうじゃない場合はそのまま出力する、と言う問題として読み替える事が出来るのです。
ちなみに、こういう「失敗を何度か続けた後に成功する」と言う確率分布モデルがあって、それを幾何分布と言います。
\mathrm{Pr}\left( k\right) :=p\,{\left( 1−p\right) }^{k−1}そうすると、要素数自体がこの幾何分布に従う確率変数となって、これで一気に文字列を生成する事が可能となります。
上の写真で言うと、Number of Failures until Success(成功するまでの失敗の数)が4以上の時に「キ・ヨ・シ!」を出力してそれより小さい場合は「キ・ヨ・シ!」を出力しなければ題意が満たせます。
さて、このロジックでプログラムを実装しますが、使用する言語はPython(2.7)、あとは幾何分布に従う確率変数を用いる為、Numpyを利用します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
def zundoko(): | |
zun, doko, kiyoshi = "ズン\n", "ドコ\n", "キ・ヨ・シ!" | |
def prob(): | |
k = np.random.geometric(p = 0.5) | |
if k < 5: | |
return zun * (k - 1) + doko | |
else: | |
return zun * (k - 1) + doko + kiyoshi | |
while True: | |
yield prob() |
一応、マイブームなんで、問題の要件とは若干違いますが、ジェネレータで実装しています(笑)。
次のようにして遊びます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
>>> z = zundoko() | |
>>> print z.next() | |
ズン | |
ドコ | |
>>> print z.next() | |
ズン | |
ドコ | |
>>> print z.next() | |
ドコ | |
>>> print z.next() | |
ズン | |
ドコ | |
>>> print z.next() | |
ズン | |
ズン | |
ドコ | |
>>> print z.next() | |
ズン | |
ズン | |
ドコ | |
>>> print z.next() | |
ドコ | |
>>> print z.next() | |
ズン | |
ドコ | |
>>> print z.next() | |
ドコ | |
>>> print z.next() | |
ドコ | |
>>> print z.next() | |
ズン | |
ズン | |
ズン | |
ズン | |
ドコ | |
キ・ヨ・シ! | |
>>> |
これがなかなか、目的の文字列が出ないんですよね(笑)。
ちなみに、フツーに実装しようが、今回みたいに幾何分布を利用して実装しようが結果は(理論的には)変わりません。
基本的に「ズンズンズンズンドコ キ・ヨ・シ!」が成立する確率は計算上、これ以上に「ズン」の部分が長い文字列の場合と合わせて、実は6.25%しかなく、反面、「ズン」の連続が4回に満たない文字列の出現確率は93.75%もあります。
つまり、このジェネレータを回しても10回に1回は出ない、って事なんですね。
0 件のコメント:
コメントを投稿