forum.vnstele.com http://forum.vnstele.com/ |
|
Вирішення імовірнісної задачі з дикого Заходу http://forum.vnstele.com/viewtopic.php?f=2&t=10488 |
Сторінка 1 з 1 |
Автор: | echern [ 23 березня 2016, 13:42 ] |
Тема повідомлення: | Вирішення імовірнісної задачі з дикого Заходу |
Вирішення ймовірнісної задачі методом статистичних випробувань. Умова задачі була взята із списку логічних задач, що можуть задаватися на різноманітних співбесідах в ІТ-галузі (ходять чутки, що таку задачу навіть задають на співбесіді у самій Microsoft ![]() Отже, претендент заходить у кімнату, де на його очах у барабан револьвера ємністю 6 вставляють два патрони підряд, барабан прокручують на випадкову кількість клацань, після чого претендент прикладає револьвер до свого коліна (в оригіналі було до голови, але я вирішив пом'якшити умови) і натискає на гачок. Вистрелу не пролунало. Питання: що краще для претендента з точки зору імовірності - натиснути ще раз на спусковий гачок чи прокрутити барабан на випадкове число клацань, а тоді вже прикласти до коліна і натиснути на гачок. |
Автор: | echern [ 23 березня 2016, 13:43 ] |
Тема повідомлення: | Re: Вирішення імовірнісної задачі з дикого Заходу |
Відповідь для різноманітності отримана з допомогою програмки на 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; } } |
Сторінка 1 з 1 | Часовий пояс UTC + 2 годин [ DST ] |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |