Паскаль. Основы программирования

       

Задача Бюффона


Пример 5. На большой лист клетчатой бумаги со стороной клетки 1 случайно бросают точку. Какова вероятность, что она будет находиться на расстоянии меньше 1/2 от центра некоторой клетки?

Математическая схема решения

Достаточно рассмотреть одну клетку. Точки, находящиеся на расстоянии не более 1/2 от ее центра, заполняют круг площади

/4. Это и есть ответ: искомая вероятность (отношение площади круга к площади клетки) равна
/4.

Эту задачу можно использовать для вычисления числа

.

Для этого задачу можно перефразировать так:

"На большой лист клетчатой бумаги со стороной клетки 1 случайно бросают точки. Вычислить значение числа

".

Для решения и этой задачи достаточно рассмотреть одну клетку.

Впишем в эту клетку окружность, радиус которой будет равен 1/2. Построим систему координат с началом в центре, вписанной в клетку окружности (см. рис. 35). Тогда площадь круга равна

 

Площадь квадрата равна S2 = 1.

Рис. 35

Как мы уже выяснили из предыдущей задачи вероятность того, что точка попадет в круг равна отношению площади круга к площади квадрата:

 С помощью компьютера эту вероятность можно определить следующим способом.



Мы можем "заставить" компьютер "бросать" в квадрат точки и подсчитать число всех точек и тех, которые попадут в круг.

Тогда вероятность определить просто, - надо будет найти отношение числа точек, попавших в круг к общему числу "брошенных" точек. Это значение и даст нам искомую вероятность.

Будем "бросать" в этот квадрат точки. Их координаты должны быть заключены в промежутке от -1/2 до 1/2 и могут задаваться функциями случайных чисел:

x := random - 1/2 и y := random - 1/2.

Координаты точек, которые попадают в круг должны удовлетворять неравенству:

Пусть общее число "брошенных" точек - n, а число точек попавших в круг - m, тогда, вероятность попадания точек в круг будет равна отношению числа точек, попавших в него, к общему числу брошенных точек: p :=  m/n.

Отсюда получаем, что S1/S2= m/n или


Таким образом, мы получаем способ для вычисления числа
.
Программа
Program Problem5;
    uses WinCrt;
    var
       x, y, p, e, pp : real;
       i, n, m          : longint;
{----------------------------------------------------------------------------------------}
{ Интегральная функция Муавра-Лапласа }
   Function FF(x : real) : real;
      var
         n     : integer;
         u, I : real;
      begin
        if x >= 5
          then FF := 1
          else if x <= -5
                   then FF := -1
                   else
                     begin
                       u := x; n := 0; I := 0;
                       repeat
                           I := I + u;
                           n := n + 1;
                           u := -u*(x*x*(2*n - 1)/(2*n*(2*n + 1)))
                       until abs(u) < 0.00001;
                       FF := 2*I/sqrt(2*Pi)
                     end
      end;
{----------------------------------------------------------------------------------------}
{ Процедура вычисления числа испытаний при заданной гарантиро- }
{ ванной вероятности и заданной точности частости              }
   Procedure
NumberExperiment(e, PP : real; var n : longint);
      var
        x : real;
      begin
        n := 0;
        repeat
          n := n + 1;
          x := 2*e*sqrt(n)
        until FF(x) >= PP
      end;
{----------------------------------------------------------------------------------------}
    begin
      randomize;
      write('Введите гарантированную вероятность '); readln(PP);
      write('Введите точность вычисления '); readln(e);
      NumberExperiment(e, PP, n);
      m := 0;
      for i := 1 to n do
        begin
          x := random - 1/2; y := random - 1/2;
          if x*x + y*y <= 1/4 then m := m + 1
        end;
      p := 4*m/n;
      writeln('Значение числа Pi равно ', p:8:6);
      writeln('С точностью до ', e:1:6);
      writeln('С гарантированной вероятностью ', PP:1:4);


      writeln('При числе испытаний ', n)
    end.
Пример 6. (задача Бюффона об игле). Плоскость разлинована на полосы шириной 1. На нее бросают иглу (отрезок) длиной 1. Какова вероятность, что игла пересечет одну из линий? (См. рисунки 36, 37 и 38).
 
Решение
У этой задачи удивительный ответ:
. Откуда же берется
, если в условии нет речи ни об окружностях, ни о расстояниях?
Наметим коротко одно из решений. Положение иглы (если не говорить о смещении ее вдоль линий, очевидно, не играющем роли) определяется двумя параметрами: расстояние y конца иглы от верхнего края полосы, в которую он попал
 и углом
 иглы с прямой, перпендикулярной линиям.

Рис. 36
Можно считать, по соображениям симметрии, что
<
/2. Условие, при котором игла пересекает край полосы: y < cos
. Итак, среди точек (
, y) в прямоугольнике
,
 мы должны выбрать лежащие ниже линии y = cos
и найти отношение площади S1
полученной фигуры к площади S2 прямоугольника
 Для тех, кто знаком с понятием интеграла, найти площадь фигуры под кривой нетрудно: S1=1.

Рис. 37
И тогда, вероятность того, что игла пересечет одну из линий будет равна:

С другой стороны, вероятность пересечения иглой одной из линий будет равна отношению числа пересечений к общему числу "бросаний" иглы: p = m/n. Приравнивая значения вычисленных вероятностей по первому и по второму способам, получим:
 отсюда
 
Выясним случайные координаты иглы, - угла
 и ординаты y. Для ординаты случайные значения уже известны: 0 < y < 1.
Как определить величину угла
?
Для этого расположим систему координат так, чтобы ее начало совпадало с концом иглы, ось OX была параллельна, проведенным прямым. Возьмем на игле две произвольные точки A и B, их координаты соответственно равны (x1, y1) и
 ясно, они являются случайными числами из промежутка (0, 1), т.е.
 
 
 тогда легко найти, что

Отсюда, значение угла

Чтобы игла пересекала хотя бы одну линию надо, чтобы y удовлетворял условию:
 или


Рис. 38
Программа
Program Problem6;


    uses WinCrt;
    var
       x1, x2, y1, y2, y, p, e, pp : real;
       i, n, m                              : longint;
{----------------------------------------------------------------------------------------}
{ Интегральная функция Муавра-Лапласа }
   Function FF(x : real) : real;
      var
         n      : integer;
         u, I  : real;
      begin
        if x >= 5
          then FF := 1
          else if x <= -5
                   then FF := -1
                   else
                     begin
                       u := x; n := 0; I := 0;
                       repeat
                           I := I + u;
                           n := n + 1;
                           u := -u*(x*x*(2*n - 1)/(2*n*(2*n + 1)))
                       until abs(u) < 0.00001;
                       FF := 2*I/sqrt(2*Pi)
                     end
      end;
{----------------------------------------------------------------------------------------}
{ Процедура вычисления числа испытаний при заданной гарантиро- }
{ ванной вероятности и заданной точности частости              }
   Procedure
NumberExperiment(e, PP : real; var n : longint);
      var
        x : real;
      begin
        n := 0;
        repeat
          n := n + 1;
          x := 2*e*sqrt(n)
        until FF(x) >= PP
      end;
{----------------------------------------------------------------------------------------}
    begin
      randomize;
      write('Введите гарантированную вероятность '); readln(PP);
      write('Введите точность вычисления '); readln(e);
      NumberExperiment(e, PP, n);
      m := 0;
      for i := 1 to n do
        begin
          x1 := random; x2 := random;
          y1 := random; y2 := random; y := random;
          if y < cos(arctan((x1 - x2)/(y1 - y2))) then m := m + 1
        end;
      p := 2*n/m;
      writeln('Значение числа Pi равно ', p:8:6);
      writeln('С точностью до ', e:1:6);
      writeln('С гарантированной вероятностью ', PP:1:4);
      writeln('При числе испытаний ', n)
    end.
Задание 19
Отрезок разделён на три равные части. Какова вероятность, что три точки, случайно брошенные на отрезок, попадут в три разные кусочка? Составьте программу.

Содержание раздела