Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2017, 23:28   #1
Young_programmer
Пользователь
 
Регистрация: 25.01.2017
Сообщений: 27
Вопрос Задача Бюффона о бросании иглы

Как решать задачу Бюффона с помощью программирования? Помогите, пожалуйста, с алгоритмом.
Young_programmer вне форума Ответить с цитированием
Старый 15.03.2017, 23:54   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Эту что ли? Бю
Что значит решить? Смоделировать бросание иглы?

Если это, то вот, разбирайтесь. На Delphi, без верхушки, там понятно что.
Код:
const
 HH=100.0;  // высота поля, куда бросают

implementation
uses Math;
{$R *.dfm}
procedure NeedleThrow(L:Double;var h1,h2:Double);
begin
 h1:=HH*Random;
 h2:=h1+L*Sin(2*PI*Random);
end;
function NumberOfIntersections(h1,h2,r,L:Double):Integer;
var s,nr,i:Integer;
    t:Double;
begin
 s:=0;
 nr:=Floor((HH+L)/r);
 if h2<h1 then
  begin
   t:=h1;
   h1:=h2;
   h2:=t;
  end;
 for i:=0 to nr do
  if (i*r>h1)and(i*r<h2) then Inc(s);
 Result:=s; 
end;
procedure TForm1.Button1Click(Sender: TObject);
var h1,h2,r,L:Double;
   N,k,i:Integer;
begin
 r:=10;          // расстоянии между линиями
 L:=9;           //  длина иглы
 N:=1000000; //  число бросков
 k:=0;           //  число пересечений
 for i:=1 to N do
  begin
   NeedleThrow(L,h1,h2);
   k:=k+NumberOfIntersections(h1,h2,r,L);
  end;
 Edit1.Text:=FloatToStr(k/N);
end;

initialization
 Randomize;
end.

Последний раз редактировалось type_Oleg; 16.03.2017 в 00:57.
type_Oleg вне форума Ответить с цитированием
Старый 16.03.2017, 15:50   #3
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Нашел у себя ошибку. В функции NumberOfIntersections надо так:
Код:
for i:=-Round(L/r) to nr do
Это сказывается при длинной игле.
type_Oleg вне форума Ответить с цитированием
Старый 16.03.2017, 17:51   #4
Young_programmer
Пользователь
 
Регистрация: 25.01.2017
Сообщений: 27
По умолчанию

А можно пошагово объяснить каким образом моделировали?
Young_programmer вне форума Ответить с цитированием
Старый 16.03.2017, 18:07   #5
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Цитата:
Сообщение от Young_programmer Посмотреть сообщение
пошагово
NeedleThrow: Моделиуем ( генерируем ) координаты концов иглы. Горизонтальные координаты не имеют никакого значения, их не рассматриаем.
Random - возвр. случ. велич., равномерно распределенную 0...1.
h1 - координата одного конца иглы.
h2 - координата другого конца иглы. Кстати, может быть h1<h2, а может быть h1>h2.

NumberOfIntersections - подсчет количества пересечений. Их может быть и > 1, если длина иглы L > r (расст. между линиями).
Изображения
Тип файла: png igla.png (5.2 Кб, 161 просмотров)
type_Oleg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игла Бюффона на Си Bilymo Visual C++ 3 08.03.2013 23:51
Задача по подсчёту статистики использования букв. Другая задача - по длинной арифметике Pascal ABC kimberly Паскаль, Turbo Pascal, PascalABC.NET 3 24.12.2012 17:03
задача о бросании тела (дифференциальные уравнения) botane4ka Общие вопросы C/C++ 0 11.06.2012 21:13
Задача на оптимальный расчет маршрута (задача в презентации) в табличном процессоре Excel Toofed Помощь студентам 0 30.11.2011 01:12