Avatar billede mikze Nybegynder
05. marts 2009 - 23:38 Der er 7 kommentarer og
1 løsning

Matematik statistik hjælp

Hej eksperter,

Jeg sidder med en matematisk opgave der lyder således:

Der er et klubhus hvor medlemmerne holder en konkurrence. Der er 10 præmier på spil og de medlemmer som deltager kan kun vinde én gang (altså ikke vinde 2 præmier) - alle præmier er ens.

Det gælder om at få så mange nye medlemmer til klubhuset som muligt, og for hver nyt medlem der bliver skaffet får ham som skaffer dette medlem 1 lod i konkurrencen. Vi har da nu eksempelvis 10 personer hvor 1 af disse personer har skaffet 50 nye medlemmer og de andre kun har skaffet 1 nyt. Alles chance for at vinde en præmie vil da være 100%. Dette fordi, at der er 10 præmier og en person ikke kan vinde to præmier.

Er der derimod 11 personer vil den person der har skaffet 50 nye medlemmer have større chance for at vinde end de andre 10 som kun har skaffet 1 medlem. Dog vil de andre 10 dog alligevel have en stor chance for at vinde en præmie på lige omkring de 90%.

Jeg har da brug for at finde ud af, hvordan jeg udregner hvor stor procent chance én af disse personer har for at vinde. Det er umiddelbart nemt at regne hvor stor chancen for blive trukket første gang er (det må være 1/60) - men hvor stor er chancen for at vinde en præmie?

--------------

Jeg har prøvet at løse dette i programmering i .NET hvor jeg simulerer et lotteri med følgende info. Lotteriet tjekker jeg da om den persons (hvis vinderchancer jeg er ude efter) vinder. Jeg lader da lotteriet køre 2000 gange og udregner hvor mange gange han har vundet en præmie ud af de 2000 gange - og finder altså en gennemsnitlig statistik.


Er der en formel eller en anden måde hvorpå man statistisk kan udregne dette?
Avatar billede arne_v Ekspert
06. marts 2009 - 04:20 #1
Mit bud:

P(halvtreds) = 1 - 10/60*...*1/60 = 1 - 10!/60^10 = 0,99999999999399862825788751714678

P(tier) = P(halvtreds)*9/10 + (1-P(halvtreds))*1 = 0,9000000000006001371742112482861
Avatar billede mikze Nybegynder
06. marts 2009 - 12:28 #2
Tak arne_v, det lyder meget sandsynligt - i hvert fald at de 10 andre har ca. 90% chance for at vinde!

Kan du evt. forklare udregningerne?

Hvad ville der ske hvis én person havde 50 tilmeldte, en person havde 33, to personer havde 10 tilmeldte og de sidste 7 havde 1 tilmeldt?
Avatar billede arne_v Ekspert
06. marts 2009 - 14:42 #3
P(tier)=P(halvtreds)*P(tier|halvtreds) + P(ikke halvtreds)*P(tier|ikke halvtreds)
Avatar billede arne_v Ekspert
06. marts 2009 - 14:42 #4
Det sidste bliver vist en lidt lang udregning, men den maa kunne laves paa lignende vis.
Avatar billede mikze Nybegynder
10. marts 2009 - 15:46 #5
Hej Arne igen!

Jeg har aldrig rodet med kombinatorik og det niveau indenfor matematik, kan du evt. uddybe hvad det er du gør igen?

Evt. forklare det som et .NET programmerings-script. Meningen er nemlig, at jeg dynamisk skal kunne udregne dette (altså at det ikke er en matematikopgave) :-)
Avatar billede arne_v Ekspert
13. april 2009 - 05:18 #6
Jeg har lavet et C# program.

Det ser stærkt ud som om min udregning ovenfor er forkert.

using System;
using System.Collections.Generic;
using System.Linq;

namespace E
{
    public class Program
    {
        private static void Find(int[] n, int m, long[] good, ref long total)
        {
            if(m > 0)
            {
                for(int i = 0; i < n.Length; i++)
                {
                    if(n[i] > 0)
                    {
                        int sav = n[i];
                        n[i] = 0;
                        long[] good2 = new long[n.Length];
                        long total2 = 0;
                        Find(n, m - 1, good2, ref total2);
                        n[i] = sav;
                        for(int ix = 0; ix < n.Length; ix++)
                        {
                            good[ix] += (n[i] * good2[ix]);
                        }
                        total += (n[i] * total2);
                    }
                }
            }
            else
            {
                for(int ix = 0; ix < n.Length; ix++)
                {
                    if(n[ix] == 0)
                    {
                        good[ix]++;
                    }
                }
                total++;
            }
        }
        public static void Calc(int[] n, int m)
        {
            long[] good = new long[n.Length];
            long total = 0;
            Find(n, m, good, ref total);
            double[] p = new double[n.Length];
            for(int i = 0; i < n.Length; i++)
            {
                p[i] = good[i] / (double)total;
            }
            double sum = 0;
            for(int i = 0; i < n.Length; i++)
            {
                Console.WriteLine(n[i] + " => " + p[i]);
                sum += p[i];
            }
            Console.WriteLine(m + "=" + sum);
        }
        public static void Main(string[] args)
        {
            Calc(new int[] { 10, 1 }, 2);
            Calc(new int[] { 10, 1, 1 }, 2);
            Calc(new int[] { 50, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 10);
            Calc(new int[] { 50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 10);
            Calc(new int[] { 50, 33, 10, 10, 1, 1, 1, 1, 1, 1, 1 }, 10);
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
13. april 2009 - 16:34 #7
En lettere optimeret udgave:

using System;
using System.Collections.Generic;

namespace E
{
    public class Program
    {
        private static void Find(int[] n, int m, long scale, long[] good, ref long total)
        {
            if(m > 0)
            {
                for(int i = 0; i < n.Length; i++)
                {
                    if(n[i] > 0)
                    {
                        int sav = n[i];
                        n[i] = 0;
                        Find(n, m - 1, scale * sav, good, ref total);
                        n[i] = sav;
                    }
                }
            }
            else
            {
                for(int ix = 0; ix < n.Length; ix++)
                {
                    if(n[ix] == 0)
                    {
                        good[ix] += scale;
                    }
                }
                total += scale;
            }
        }
        public static void Calc(int[] n, int m)
        {
            long[] good = new long[n.Length];
            long total = 0;
            Find(n, m, 1, good, ref total);
            double[] p = new double[n.Length];
            for(int i = 0; i < n.Length; i++)
            {
                p[i] = good[i] / (double)total;
            }
            double sum = 0;
            for(int i = 0; i < n.Length; i++)
            {
                Console.WriteLine(n[i] + " => " + p[i]);
                sum += p[i];
            }
            Console.WriteLine(m + "=" + sum);
        }
        public static void Main(string[] args)
        {
            Calc(new int[] { 10, 1 }, 2);
            Calc(new int[] { 10, 1, 1 }, 2);
            Calc(new int[] { 50, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 10);
            Calc(new int[] { 50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 10);
            Calc(new int[] { 50, 33, 10, 10, 1, 1, 1, 1, 1, 1, 1 }, 10);
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
06. december 2009 - 04:15 #8
og et svar fra mig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester