こんにちわ、みけです。
昨日ツイッター見てたら、こんなツイートが回ってきました。
これ書いた人、多分数学の授業サボってたからロジカルシンキングが身に付いてないんだなw 宝くじの当選確率は個人が買ったくじの数に比例するだろw こいつ絶対カイジの登場人物だったら食い物にされる側だ。 / “ロジカルシンキングができな…” http://t.co/NabovlMnDw
— やわなメンタルのjoker (@joker1007) 2015, 2月 10
で、気になる本文の方を読んだら、
1等当選宝くじが出た場所で、再び1等当選が出る確率は最も低い
また、訂正でも
1等当選宝くじが出た場所で、再び1等当選が出る確率は他の宝くじ売り場(全て)よりも低い
とあって、意味がよくわからなかったのでシミュレートしてみることにしました。
ただ、僕は宝くじを買ったことがないので、宝くじがどれくらいの規模で売られているものかよくわからないので、下記の仮定に基づいてシミュレートしてみました。
- 宝くじの販売回数は10,000回
- 宝くじの店舗数は10,000店
- 1つの店で売られる宝くじの枚数は10,000~20,000枚
で、シミュレートするスクリプトはいつもどおりGroovy + GPars
@Grab('org.codehaus.gpars:gpars:1.2.1') import static groovyx.gpars.GParsPool.withPool ArrayList.metaClass.define { random = {delegate.get(new Random().nextInt(delegate.size()))} hasSuccess = { def prev = delegate.get(0) def result = false def index = 1 while(!result && index < delegate.size()) { if (prev == delegate.get(index)) result = true else prev = delegate.get(index++) } result } } groovyx.gpars.extra166y.ParallelArray$AsList.metaClass.define { random = {delegate.get(new Random().nextInt(delegate.size()))} } 100.times { assert [1,2,3,4,5,6,7].random() in [1,2,3,4,5,6,7] } assert [1,2,3,4,5].hasSuccess() == false assert [0,1,1,0].hasSuccess() == true assert [1,1].hasSuccess() == true IntRange.metaClass.define { random = {delegate.min() + new Random().nextInt(delegate.size())} } 100.times { assert (1..7).random() in (1..7) } Integer.metaClass.define { collect = {Closure c -> def list = [] delegate.times {num -> list << c(num) } return list } } assert (10.collect{it} == [0,1,2,3,4,5,6,7,8,9]) withPool(4) { def result = (1..10000).collectParallel {/*10,000回試行*/ def list = Collections.synchronizedList([]) withPool(4) { list << new IntRange(1, (10000..20000).random()/*店あたりの販売枚数*/).collectParallel { (1..10000).random()/*店舗の番号*/ }.random() } return list }.flatten() println result.hasSuccess() }
試行結果はtrue
なら連続して同じ店から当選が出る、false
なら連続して同じ店から当選が出ることはない
で、結果は
false
でした。残念(´・ω・`)
同じ店から当選が出てるかどうかは、残念ながら調べていません(´・ω・`)
もしかしたら当選している事例があったかもしれません。
なお、16個のForkJoinPool(4個の並行処理の中で4個の並行処理)で実行して、
Gparsで8並行で1億件くらいの演算してみたら、やばいことになった pic.twitter.com/llPiwZLccm
— もちだでしたが、衰退しました (@mike_neck) 2015, 2月 10
CPUがこんな感じで、CPU時間が19時間44分行ってたので、約1時間とちょっと程度で処理が出来たことを考えると、後でやってみるかもしれません5時間もかかってるじゃないですかー!多分もうやりません。
なお、本文の訂正として
1等当選宝くじが出た場所で、再び1等当選が出る確率は他の宝くじ売り場(全て)よりも低い
の根拠としてサイコロの出目の数の話をして、連続で同じ目が出る確率と個々の目の出る確率を比較していましたが、「1の目が出た後に1の目が出る確率は1/6」ですよ?
PA(B)
とか習わなかったんですかね???
あ、習わないって?それはすっごい古い教育課程の数学の話とな……はい、もうオッサン通り越しておじいさんです(´・ω・`)