|
Тема |
. |
|
Автор | . (Нерегистриран) | |
Публикувано | 01.07.05 18:31 |
|
|
ICT302 - Теория на вероятностите и статистика
Метод на статистическото моделиране - Метод Монте Карло
--------------------------------------------------------------------------------
Задача:
Играта 6/49 на Българския спортен тотализатор се състои в последователното изтегляне на 6 числа, от 49 възможни. Всеки участник попълва фиш в който прави предположение какви ще бъдат 6-те изтеглени числа, в следващия тираж. Интересува ни каква е вероятността поне 5 от тях да бъдат четни.
Решение:
Търсената вероятност може да се определи, чрез формула за броя на всички благоприятни ситуации отнесен към броя на всички възможни комбинации.
P(X=5,6)=C(24,5)*C(25,1)/C(49,6)+C(24,6)*C(25,0)/C(49,6)
P(X=5,6)=(24!/(5!*19!)*25!/(1!*24!))/(49!/(6!*43!))+(24!/(6!*18!)*25!/(0!*25!))/(49!/(6!*43!)))
За целите на настоящото разглеждане ще предположим, че тази формула не ни е известна и ще реализираме експеримент, базиран на Метода на статистическото моделиране с чиято помощ ще определим приблизително търсената вероятност. За целта ще проведем N (N>10000) експериментални тегления, в които ще отчетем благоприятните случаи K (K<=N). Отношението K/N ще ни даде, с приближение, търсената вероятност.
Всяко експериментално теглене ще моделираме с помощта на генератор на псевдослучайни числа в интервала [0, 1]. С помощта на подходящи преобразувания ще получим равномерно дискретно разпределение за стойностите в интервала [1, 49]. Във всяко експериментално теглене ще следим изтеглените числа да са без повторение.
Тъй като получената оценка по същество представлява статистика по-голямо N ще води до по-точно приближение към действителната стойност.
Програмен текст:
class TOTO{
private int N;
private int K;
private int numbers[];
private boolean isOk()
{
int cnt = 0;
for(int i=0; i<6; i++)
if(numbers[i ]%2 == 0)
cnt++;
if(cnt >= 5)
return( true );
else
return( false );
}
private void takeNumbers()
{
for(int i=0; i<6; i++)
{
int rnum;
boolean isDone;
do
{
rnum = (int)(Math.random()*49+1);
isDone = true;
for(int j=0; j<i; j++)
if(rnum == numbers[j])
isDone = false;
}
while( !isDone );
numbers[ i ] = rnum;
}
}
public TOTO(int N)
{
this.N = N;
K = 0;
numbers = new int[ 6 ];
}
public void print()
{
System.out.println( (double)K/(double)N );
}
public void test()
{
K = 0;
for(int l=0; l<N; l++)
{
takeNumbers();
if( isOk() )
K++;
}
}
}
public class ICT302App{
public static void main(String[] args)
{
TOTO toto = new TOTO( 100000 );
toto.test();
toto.print();
}
}
|
| |
|
|
|