| 
	
 | 
 
Страници по тази тема: 1 | 2 | 3 | (покажи всички)
           
             
               
               
                 
                   | 
                   Тема
                    | 
                     Вероятност 
 | 
 
 |  
| Автор | 
Dijkstra (сектант) |  
| Публикувано | 30.05.11 15:53 |  
             |  
           | 
            
           
  вероятността да се падне тура е 90%
 вероятността да се падне ези е 10%
 монетата се хвърля 1000 пъти
 каква е вероятността в тези 1000 хвърляния да се падне поредица от 20 или повече тура?
 
 пример:
 TETETETETETE .... TTTTTTTTTTTTTTTTTTTT.....TETE - 1000 хвърляния 
 
 
 С долния код на Ц# ми го изкарва 100% 
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Security.Cryptography;
 
 namespace ConsoleApplication1
 {
     class Program
     {
         // possibility for 1 = 0.9
         //possibility for 0 = 0.1
         static byte[] thousand = new byte[1000];
         static void Fill()
         {
             
             byte tmp;
             for (int i = 0; i < 1000; i++)
             {
                 tmp =RollDice(10);
                 if (tmp == 0)
                 {
                     thousand = 0;
                 }
                 else
                 {
                      thousand = 1;
                 }
             }
         }
 
         static bool Check()
         {
             int start = 0;
             for (int i = 0; i < 1000; i++)
             {
                 if (thousand == 0)
                 {
                     start = 0;
                 }
                 else
                 {
                     start++;
                     if (start >= 20)
                     {
                         return true;
                     }
                 }
             }
             return false;
         }
 
         static void Main()
         {
             int counter = 0;
             for (int i = 0; i < 100000; i++)
             {
                 Fill();
                 if (Check())
                 {
                 counter++;
                 }
             }
             Console.WriteLine(counter);
             counter = Console.Read();
         }
 
 
 
         // This method simulates a roll of the dice. The input parameter is the
         // number of sides of the dice.
 
         public static byte RollDice(byte numberSides)
         {
             if (numberSides <= 0)
                 throw new ArgumentOutOfRangeException("numberSides");
             // Create a new instance of the RNGCryptoServiceProvider.
             RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
             // Create a byte array to hold the random value.
             byte[] randomNumber = new byte[1];
             do
             {
                 // Fill the array with a random value.
                 rngCsp.GetBytes(randomNumber);
             }
             while (!IsFairRoll(randomNumber[0], numberSides));
             // Return the random number mod the number
             // of sides.  The possible values are zero-
             // based, so we add one.
             return (byte)((randomNumber[0] % numberSides));
         }
 
         private static bool IsFairRoll(byte roll, byte numSides)
         {
             // There are MaxValue / numSides full sets of numbers that can come up
             // in a single byte.  
             int fullSetsOfValues = Byte.MaxValue / numSides;
 
             // If the roll is within this range of fair values, then we let it continue.
             
             return roll < numSides * fullSetsOfValues;
         }
 
     }
 }
 
  
           
  
             |   |  
           
             | 
               
                |  
           | 
            
           
  Не знам какво прави програмата, но предполагам, че е от закръгляне. Вероятноста е много близка до 100%. Разликата е след хилядния знак след запетаята, и затова сигурно го закръглява.
  
           
  
             |   |  
           
             | 
               
                |  
           | 
            
           
  броя на опитите е твърде малък за да се измери вероятност.
 
 аз написах малко по-оптимизиран алгоритъм за смятане
 
 int test()
 {
 
 	int seq=0;
 	for(int i=0;i<1000;i++){
 		int r=rand()&0xfff;
 		if(r>0xfff/10)seq++;
 		else seq=0;
 		if(seq==20)return i;
 	}
 	return 0;
 }
 
 
 int main(){
 	srand(GetTickCount());
 	int i,j;
 	int not=0;
 	__int64 start=0;
 	int sn=0;
 	for(i=0;i<N;i++){
 		if(j=test()){
 			start+=j-20;
 			sn++;
 		}else not++;
 		if(i%(N/100)==0)printf("|");;
 	}
 
 	printf("p=%d start:%f\n",not,(double)start/sn);
 	scanf("%d\n",&i);
  
 
 и при 100 милиона опита все още няма нито едно събитие, а смята към две минути. ще го пусна на работа на бърз компот с повече опити. разпечатвам и средното място където се намира поредицата, което е някъде към позиция 51.34. 
 
 впрочем, разпределението би трябвало да е близко до поасоново и може да се сметне теоретично и да се сравни с резултата от симулацията.
 
 
 
 NE SUTOR ULTRA CREPIDAMРедактирано от zaphod на 31.05.11 07:45. 
           
  
             |   |  
           
             
               
               
                 
                   | 
                   Тема
                    | 
                     1 милиард опита 
[re: zaphod]
 | 
 
 |  
| Автор | 
zaphod (мракобес) |  
| Публикувано | 31.05.11 10:31 |  
             |  
           | 
            
           
  и нито един случай. обаче, може да предположим че вероятността да не се случи поредица намалява експоненциално с дължината на поредицата, и измервайки средното място за поява на поредица индиректно да сметнем каква е вероятността. ако това е така, може да очакваме че вероятността е близо едно на три милиарда, което е на границата на това което меря, но ще го пусна обедната почивка с 10 милиарда опита да видим какво ще направи. правя проби сега, 
 с вероятност 8/9 дава 98 събития за 100 милиона опита, което е 1/милион, при средна поява на позиция 65, хиляда делено на логаритъм от милион е 72, значи
 с вероятност 7/8 дава 2930 събития, среден старт на 86, хеляда делено на логаритъма е 95, 
 с вероятност 6/7 дава старт на 124, по горната формула получавам 134.
 странно все пак, човек би помислил че  корекцията е 10тина%, което значи че на 50-100 милиона проби трябва да има събитие.
  
 
 
 NE SUTOR ULTRA CREPIDAM
           
  
             |   |  
           
             | 
               
                |  
           | 
            
           
  аз съм съгласен с хариш, че вероятността е близо до 100%. ако вероятността за тура е p, a броя на хвърлянията е n, приблизителна формула за очакваната дължина от поредни тура е -log(n*(1-p))/log(p). за n=1000, p=0.9 очакваме поредица от 40тина поредни тура. вероятността за 20 и повече е близка до единица, не знам що твойта симулация дава подобни резултати
  
           
  
             |   |  
           
             | 
               
                |  
           | 
            
           
  че е близка близка е, никой не спори. но колко е близка?
  
 
 
 NE SUTOR ULTRA CREPIDAM
           
  
             |   |  
           
             | 
               
                |  
           | 
            
           
  след като за 0.9 се различаваше твърде силно от очакваното, смених рнд генератора и вече се съгласува добре - 50 на милиард опита. 
 имам предвид, в оригиналната формулировка вероятността е 1-50/1е9
  
 
 
 NE SUTOR ULTRA CREPIDAM
           
  
             |   |  
           
             | 
               
                |  
           | 
            
           
  Това не е ли от стандартните примери, марковски вериги или не знам си какво. Може да се сметне точно без симулации. Най-малкото би трябвало да може да се напише лесно рекурентна зависимост.
  
           
  
             |   |  
           
             | 
               
                |  
           | 
            
           
  аха аз си поислих че ти твърдиш обратното понеже не ми стана ясно какво наричаш "събитие". иначе може да се сметне директно с рекурсивната формула като в (4):
 
  
           
  
             |   |  
           
             | 
               
                |  
           | 
            
           
  Добре си се сетил да смениш рандом генератора. Стандартния rand() не став за симулации. За С++ от boost marsene twistera е добър например.
  
           
  
             |   |  
  |   
 
 
Страници по тази тема: 1 | 2 | 3 | (покажи всички)
 |  
 |   
 |