mike-neckのブログ

Java or Groovy or Swift or Golang

宝くじで一等が同じ店から出る確率

こんにちわ、みけです。

昨日ツイッター見てたら、こんなツイートが回ってきました。

で、気になる本文の方を読んだら、

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個の並行処理)で実行して、

CPUがこんな感じで、CPU時間が19時間44分行ってたので、約1時間とちょっと程度で処理が出来たことを考えると、後でやってみるかもしれません5時間もかかってるじゃないですかー!多分もうやりません。


なお、本文の訂正として

1等当選宝くじが出た場所で、再び1等当選が出る確率は他の宝くじ売り場(全て)よりも低い

の根拠としてサイコロの出目の数の話をして、連続で同じ目が出る確率と個々の目の出る確率を比較していましたが、「1の目が出た後に1の目が出る確率は1/6」ですよ?

高校生の確率統計で、事象Aの後に事象Bが発生する確率

PA(B)

とか習わなかったんですかね???

あ、習わないって?それはすっごい古い教育課程の数学の話とな……はい、もうオッサン通り越しておじいさんです(´・ω・`)