forum.vnstele.com

Вітруальне навчальне середовище телекомунікацій - Форум підтримки
Сьогодні: 28 березня 2024, 18:10

Часовий пояс UTC + 2 годин [ DST ]




Створити нову тему Відповісти  [ 2 повідомлень ] 
Автор Повідомлення
ПовідомленняДодано: 23 березня 2016, 13:42 
Офлайн
Адміністратор сайту

З нами з: 11 січня 2011, 15:00
Повідомлення: 181
Звідки: Львів
Вирішення ймовірнісної задачі методом статистичних випробувань.
Умова задачі була взята із списку логічних задач, що можуть задаватися на різноманітних співбесідах в ІТ-галузі (ходять чутки, що таку задачу навіть задають на співбесіді у самій Microsoft ;-)

Отже, претендент заходить у кімнату, де на його очах у барабан револьвера ємністю 6 вставляють два патрони підряд, барабан прокручують на випадкову кількість клацань, після чого претендент прикладає револьвер до свого коліна (в оригіналі було до голови, але я вирішив пом'якшити умови) і натискає на гачок. Вистрелу не пролунало.
Питання: що краще для претендента з точки зору імовірності - натиснути ще раз на спусковий гачок чи прокрутити барабан на випадкове число клацань, а тоді вже прикласти до коліна і натиснути на гачок.


Догори
 Профіль  
 
ПовідомленняДодано: 23 березня 2016, 13:43 
Офлайн
Адміністратор сайту

З нами з: 11 січня 2011, 15:00
Повідомлення: 181
Звідки: Львів
Відповідь для різноманітності отримана з допомогою програмки на Java.
Код:
import java.util.Random;

public class RuletkaTest {

   public static void main(String[] args) {
      
      final int N = 10000;      // Кількість дослідів
      final int bnum = 6;         // Кількість патрономісць у барабані
      final int bullets = 2;      // Кількість патронів в барабані
      
      Drum d = new Drum(bnum);   // Об'єкт барабана револьвера
//---------------------------------------------------------------------------      
      int yes = 0;            // Лічильник успішних вистрелів
      for (int i=0; i<N; i++)
      {
         d.insert(bullets);
         yes += d.shoot();
      }
      printResult("Кількість \"успішних\" попадань з першого вистрелу : \t", yes, N);
//---------------------------------------------------------------------------
      
      int two = 0;
      int count = 0;
      
      while (count < N)
      {
         d.insert(bullets);
         if (d.shoot() == 0)
         {
            two += d.shoot();
            count++;
         }
         
         if( bullets >= bnum - 1 )    // Якщо імовірність успішного вистрелу 100 %
         {
            two = N;
            break;
         }
      }
      printResult("\nКількість попадань з другого вистрелу при умові \"невдалого\" першого : \t", two, N);
//------------------------------------------------------------------------------      
      int three = 0;
      count = 0;
      
      while (count <= N)
      {
         d.insert(bullets);
         if (d.shoot() == 0)
         {
            d.insert(bullets);
            three += d.shoot();
            count++;
         }
         
         if( bullets >= bnum - 1 )    // Якщо імовірність успішного вистрелу 100 %
         {
            two = N;
            break;
         }
      }
      printResult("\nКількість \"успішних\" вистрелів з другого разу при умові \"невдалого\" першого : \t", three, N);
   }
   
   public static void printResult(String s, int a, int N)
   {
      System.out.println(s + a);
      System.out.println("Імовірність попадання : \t" + ((double)a/N));      
   }
   
}

class Drum{
   final int bnum;      // кількість патрономісць
   int[] bullets = null; // кулі: 1 - є, 0 - нема
   
   Drum(int bnum)
   {
      this.bnum = bnum;
      bullets = new int[bnum];
   }
   
   public void insert(int count)         // вставлення двох куль підряд в барабан і його прокручування на випадкову кількість кроків
   {
      if ( count > this.bnum )  count = this.bnum;
      
      for(int i=0; i<this.bnum; i++)
         bullets[i] = 0;
      
      Random rand = new Random();
      int first = Math.abs(rand.nextInt())%this.bnum;
      bullets[first] = 1;
      for(int i=1; i<count; i++)
         bullets[(first+i)%this.bnum] = 1;
   }
   
   public int shoot()         // Вистріл - повертає результат і прокручує барабан вперед на 1 позицію
   {
      int rez = bullets[0];
      oneShift();      
      return rez;
   }
   
   public void oneShift()      // Прокручування барабану на 1 позицію вперед
   {
      int rez = bullets[0];
      
      for (int i=0; i<bullets.length-1; i++)
         bullets[i] = bullets[i+1];
      bullets[bullets.length-1] = rez;      
   }
   
   public String toString()   // Можна роздрукувати кулі в барабані
   {
      String s = "";
      for(int i=0; i<bullets.length; i++)
         s += " " + bullets[i];
      return s;
   }
}


Догори
 Профіль  
 
Відображати повідомлення за:  Сортувати за  
Створити нову тему Відповісти  [ 2 повідомлень ] 

Часовий пояс UTC + 2 годин [ DST ]


Хто зараз онлайн

Зараз переглядають цей форум: Немає зареєстрованих користувачів і 1 гість


Ви не можете створювати нові теми у цьому форумі
Ви не можете відповідати на теми у цьому форумі
Ви не можете редагувати ваші повідомлення у цьому форумі
Ви не можете видаляти ваші повідомлення у цьому форумі
Ви не можете додавати файли у цьому форумі

Знайти:
Вперед:  
cron
POWERED_BY
Український переклад © 2005-2010 Українська підтримка phpBB