マル開発日記

マルAndroidデベロッパ

幾何分布2

教科書など見返してたら面白い?ことに気づいた?ので以下に書きます。

当たり確率がpなくじ(当たらない確率はq=1-pとします)があって、n回目までに当たりを引く確率は、、、
1回目に当たる確率 p
1回目に外れて2回目に当たる確率 q×p
1回目と2回目に外れて3回目に当たる確率 q²×p

n-1回目までは全て外れてn回目に当たる確率 qⁿ⁻¹×p
をすべて足したもので結局、

p(1+q+q²+ ‥ + qⁿ⁻¹) …(1)

になります。こんなにたくさん足し算はしたくないので、別の考えをします。

n回目までに当たりを引く確率を求めるのにまずn回目まで全て外れを引き続ける確率を求めてから、それ以外となる確率を求めます。
その確率は1-qⁿになります。(これについての詳しい説明は他を当たってください…)

ここまではいいのですが、(1)式も結局同じことになるのです。等比数列の和の公式を使うのです(こんな公式すでに忘却の彼方でしたが)。

p(1+q+q²+ ‥ + qⁿ⁻¹) = p × (1-qⁿ)/1-q = p × (1-qⁿ)/p = 1-qⁿ


なんか、ちょっと面白かったので投稿してみました。すんませんね。

確率の5倍もやれば当たるだろう(幾何分布)

いきなりですが…

当たりくじ等(私はやらんがガチャとか??)で最初に当たりを引くまで回数の分布は幾何分布というものらしい。
この分布(確率の累積)について考えていけば、どの程度の回数で当たりを引けるかについて予測ができそうである。
今回は以下に示すように大ざっばに5倍、例えば1/100のくじなら500回、で少なくとも一回くらいは当たりを引けるだろうと予想してみる。

ところで当選確率をpとすると、この分布の平均と分散は以下のようである。
平均 E(X) = 1/p
分散 V(X) = (1 - p) / p²

面白いことにV(X)/E(X)を計算すると、
V(X)/E(X) = (1 - p) / p = E(X) - 1 なので、
V(X) = {E(X)}² - E(X) だ。
E(X)が十分に大きければ V(X) = {E(X)}² と考えてもよさそうだ。(例えばE(X)=100なら 10000と9900の違い)
なので、標準偏差σ=√V(X)はE(X)と考えても差し支えなさそうである(適当に)。

ところで幾何分布は正規分布ではないので±2σで確度の良い予想となる訳ではない、そこでチェビシェフの不等式とやらを利用しよう。
すると、5σをとれば24/25=0.96で96%はカバーできる(因みに2σなら75%のカバー)。
σは上記のようにE(X)として確率の逆数から計算する。そしてその5倍の範囲を考えれば幾何分布の少なくとも96%はカバーしているので当たりを引くにはそうそう十分だ。
※ただし保証はしません。

各確率ごとに分布をちゃんと作って予想すれば精度は上がると思うけど、おおざっぱにこういう予想の仕方もあり。

追記)
ガチャのシミュレーションについて分かりやすいサイトを見つけたのでリンクを貼ります。シミュレーションだと約3倍でも結構いい線みたい。5倍はだいぶ広く取ってるようです。ご参考。

https://www.sky-school-ict.net/ite/information/201204.html

参考:
幾何分布 - Wikipedia
チェビシェフの不等式 - Wikipedia

3年ぶりの投稿(二項分布について)

久しぶりに投稿します。久しぶりにブログにログインしたのですが、ちゃんとhttpsになってますね。便利ですね。

折角なので二項分布の公式は便利であるということについて書きたいと思います。
回数n、確率pとすると、

平均 E = np
分散 V = np(1-p)

です。

私は最近パチンコ(パチスロ)をやりませんが、平均Eについては無意識に使っていました。
例えば設定6の確率が1/240の台を8000回まわした場合、

E = 8000 × (1/240) = 33.33333…

です。一日8000回も回せば33回は期待できるということです。

では、分散の方

V = 8000 × (1/240) × (239/240) = 33.19444…

の意味するところは何なのでしょうか、こっちの方はあまり使わない人も多いかもしれません。
仮に二項分布が正規分布になっているとすると、平均からの前後で標準偏差の約2倍(1.96でもいいけど)の分布が95%くらい占めるということです。
日本語が下手なので上の例でいくと標準偏差は、

S = √33.19444 = 5.7614
2×S = 11.5

です、ざっくりいえば設定6を一日中やった場合、22~45回で収まるはずです。これ以上、これ以下が起きることは非常に稀ということです。
あんま使えないかな(笑)。

サイコロを100回振ったとき、何回1の目がでるのが妥当?

今回はAndroidから離れます。タイトルのような確率・統計の話題です。
タイトルにあるような問題はどう解いたら良いのでしょうか。。実は公式があります。

試行回数nがそれなり(10~20以上くらい?)に大きいときは、確率pのブレは以下となりますでしょう。

se = √(p×(1 - p) / n)

割とシンプル。(数式エディタも使わないシンプルさ)

1が出る確率は1/6 (約0.167)、試行回数を100にすると。

se = √(0.167 × 0.833 / 100) = 0.0373

100回サイコロを振った場合、2倍のseの範囲は

p-2se ~ p+2se

0.167 ̟- 2×0.0373 ~ 0.167 + 2×0.0373

0.09 〜 0.24

回数は100回なので100倍すると、9~24回

サイコロを100回振った時、信頼度95%で1の目が9~24回でます。

興味あるかたは是非サイコロを振って確かめてください(笑)
(もしかしたら数学的な表現に一部誤りがあるかもしれませんが、自分は数学者ではないのでクレーム禁止)

参考文献
https://ja.m.wikipedia.org/wiki/%e4%ba%8c%e9%a0%85%e5%88%86%e5%b8%83

いままで気づかなかった

 Android開発ネタです。Dialogについてです。

 Dialogのボタンリスナに DialogInterface.OnClickListener ってのがあるんですが、イベント発生時にリスナに渡されるのは

 onClick(DialogInterface dialog, int which)


 なので、DialogInterfaceとやらが渡されます。DialogはDialogInterfaceを継承しているので、これをDialogにキャストすれば Dialog のオブジェクトとして触ることができます。
 例えばDialogにセットしたView(例えばEditText等)をonClickイベント時に使いたいと思って、DialogのAPIでgetViewなるものはないかな~ってずっと探してたんですけど、なかった。そんなメソッド。自分はゲッタはgetXXXと思い込んでいたもので。getWindowからViewを辿ってできそうな気もしてたけどちょっと面倒くさいし、なのでコード的にベストプラクティスでない方法(例えばfinalを利用するとか)でViewにアタッチしてたんです。

 で、今日なんとなくDialog APIのページを眺めていたら、あるじゃないか、findViewById とやらが。API 1の時からアルじゃないか。。

 結論は、、思い込みは良くない!でした。(こんな話して面白がる人いるのかな?)

new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
EditText text = ((Dialog) dialog).findViewById(R.id.edit);
String name = text.getText().toString();
...
}
}
});

 と美しくかける。

GCP Cloud Translation API

 久々の投稿になります。こういう時は大抵宣伝です…

 私はGoogleの回し者ではございません。自分の作ったコードを公開してちょっとドヤ顔をしてみたいだけです(それもどーかと)
 今回、Python3でGCP の Cloud Translation API を利用した翻訳スクリプトを書きました。Web上とかでGoogle翻訳を使うことはもちろん手軽にできますが、ちょっと長い文章とか翻訳する時ちょっとかったるいなーと思ったのでスクリプトにしてみました。
 もうひとつ、Androidアプリの多言語化も自動化してみたくて、strings.xmlの自動翻訳もできるようにしました!機械翻訳のクオリティでもいいからアプリを多言語化してみたいという方はおすすめです。今後、もっと機械翻訳の精度が向上してくれれば、安心して自動翻訳によるコンテンツ提供ができますね!

 さて以上のスクリプトGitHubに公開していますが、まだ Cloud Translation API を使ったことがないという方は、まず本家のページを参考にPythonで扱えるようになるまで練習してみてください。ある程度雰囲気が分かったらpipでGitHubからスクリプトをインストールしてみてください。(インストール方法等はGitHubのREADMEにあります。ちなみにREADMEの英訳はスクリプトで作りました。ちょっと変な表現あるかな。。とは思ったのですが、とんちんかんではなく理解できる範囲の英訳になっているのではないでしょうか)
 インストールが終われば、コマンドが登録されるのでCLIで操作できます。(コマンドだけで翻訳できるので、最低Pythonの環境構築の知識さえあれば利用できます。)
 
 使用上の注意として、APIは有料なので不正利用されないようにキーの管理はしっかり、また翻訳のし過ぎには気を付けてください。
 
 それでは良いアンドロイドライフを!

github.com

Googleアカウントは2段階認証しましょう

 ひとつのGmailアドレスでアカウントを登録すれば、おそらくそのアカウントで全てのGoogleのサービスを利用できるようになります。AndroidアプリをGoogle Playで公開するときも、Admob(Adsenseのモバイルアプリ版?)にログインするときも、はてまた最近始めたGCP(Google Cloud Platform)を利用するときも同じGoogleアカウントでできます。ものすごーく便利なんですが、もしこれを乗っ取られたら本当に大変な被害になりそうです。
 特にGCPなんかはうっかり使いすぎるとすぐウン万、ウン十万とか逝って。。クラウド死とかいうワードもあるくらいですから。もちろんサービスの課金方法を良く理解することも必須ですが、不正利用を防ぐためにも必ず二段階認証したほうが良いですね。
 設定はとても簡単です。でも、Googleのヘルプページの説明がイマイチ?なので若干躊躇するかも知れません。でもやることは本当に簡単です。気を付けないといけないのは、認証アプリまたはSMSを利用する端末をうっかり紛失してしまうとログインが不能になってしまうことです。自分はまだスマホを無くしたことないけど、もし無くしたらきっと寒い思いをするでしょう(笑)。確か、バックアップコードとかいうのも2段階認証の設定時に出てくるはずなので、忘れずどこかにメモって適当な金庫に保管するのが良いと思います(笑)
 とにかく、2段階認証はGoogleのサービスを利用する上で必須だと思うので、まだしてない方は絶対してくださいねー