忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

ベイズでイカサマコイン発見

コインの表が出る確率をベイズで計算するプログラムです。
ここのプログラムを少し改造しました。


プログラム

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        double[] probabilities = Enumerable.Repeat(1.0, 100 + 1).ToArray();
        normalize(probabilities);

        Random random = new Random();
        const double HeadProbability = 0.7;

        for (int i = 0; i < 5000; i++)
        {
            if (random.NextDouble() < HeadProbability)
            {
                flipCoinHead(probabilities);
            }
            else
            {
                flipCoinTail(probabilities);
            }
        }

        foreach (var probability in probabilities)
        {
            Console.WriteLine(probability);
        }
    }

    static void normalize(double[] probabilities)
    {
        double sum = probabilities.Sum();

        for (int i = 0; i < probabilities.Length; i++)
        {
            probabilities[i] /= sum;
        }
    }

    static void flipCoinHead(double[] probabilities)
    {
        for (int i = 0; i < probabilities.Length; i++)
        {
            probabilities[i] *= (double)i / (probabilities.Length - 1);
        }

        normalize(probabilities);
    }

    static void flipCoinTail(double[] probabilities)
    {
        for (int i = 0; i < probabilities.Length; i++)
        {
            probabilities[i] *= (1.0 - (double)i / (probabilities.Length - 1));
        }

        normalize(probabilities);
    }
}

結果

説明

このプログラムは2つの部分から成り立っています。
1つはいかさま師。
もう一つはいかさまを見破ろうとする部分です。

いかさま師プログラムは表が出る確率が70%のイカサマコインを5000回投げます。

もう片方のプログラムはそのコイン投げの結果から、コインがどのくらいの確率で表が出やすいのかを計算します。

「結果」のところにあるグラフはこのプログラムの出力(101個の数字)をグラフにしたものです。
表が何%の確率で出るかを表したグラフです。
このグラフによると、70%で表が出るイカサマコインだという疑いが最も高いですね。

拍手[0回]

PR