Задача Буффона об игле.Тексты программы на фортране 90, яве

Во всех учебниках по теории вероятности рассматривается задача об игле Буффона. Но не дана программа расчета,
Бросая иглу много раз на параллельные прямые, можно определить число Пи равное 3,1415926....
О ней рассказано в Википедии. https://ru.wikipedia.org/?curid=5644077&oldid=127590392 Это пример метода Монте-Карло.
Приведу текст на фортране 90.
	 program buffon_needle 
	
	! program buffon_needle f90. Файл программы имеет имя buffon_needle.f90
	
	! Buffon Needle Problem Задача  Буффона об игле
	
	! Monte Carlo Simulation of needle  Моделирование методом Монте-Карло иглы
	
	! dropping on parallel lines бросок на параллельные прямые
	
	! Simulation is used to determine the value of pi   моделирование используется для определения числа Пи
	
	! Горскин Д.В.  2023 г. 20 октября
	
	 
	
	! Using d o u b l e precision variables 
	  real(8) pi,spacing,needle_length,ninety_degrees
	
	  real(8) position,theta,hits,trials,rr 
	! Initialization of variables 
	
	! Value of Pi, 17 decimal places can be stored 
	
	! for d o u b l e precision constants 
	
	  
	
	  pi=3.14159265358979324 
	! Alternative value generated by the compiler as: pi= 4 arctan(1) 
	
	! pi=4.0*datan(1.0D0) 
	! Number of hits 
	
	  hits=0.0 
	! Number of experiments or trials 
	
	 trials = 1.0e+03 
	! Spacing between lines 
	
	 spacing = 2.0 
	
	 
	
	! needle_length (e. g. spacing /2.0) 
	
	 needle_length = 0.82624 
	! Ninety degrees as pi/2.0 
	
	 ninety_degrees = pi/2.0 
	! Simulate needle dropping 
	
	 ntrials=trials 
	do i = 1, ntrials 
	
	       call random_number(rr) 
	
	       position = (spacing / 2.0) * rr 
	
	       call random_number(rr) 
	
	       theta = ninety_degrees * rr 
	
	       costheta = cos (theta) 
	
	       projection = (needle_length / 2.0 ) * costheta 
	! Test for position of needle point 
	
	       if( position .LE. projection ) then 
	       ! Score a hit 
	
	         hits = hits + 1.0 
	
	       endif 
	
	 end do 
! Evaluation of pi
	 prob = hits/trials 
	
	 pi = (2.0*needle_length)/(spacing*prob) 
	! Write results 
	
	     write(*,*) 'Variables:' 
	
	     write(*,*) 'needle_length = ', needle_length 
	
	     write(*,*) 'spacing = ', spacing 
	
	     write(*,*) 'trials = ', trials 
	
	     write(*,*) 'hits = ', hits 
	
	     write(*,*) 'prob = ', prob 
	
	     write(*,*) 'pi = ', pi 
	
	     stop 
	
	    end 
	
	Она видоизменена с английской версии. Никаких программ больше не нужно.
Переменные — variables
Длина иглы — needle legth
Ширина клетки или решетки — spacing
Число бросков — trials.
pi — число пи
------------------------------
Результаты расчета на Scientific Linux 7.9. Использовался компиллятор фортрана 90 gfortran без параметров оптимизации.
	$ gfortran buffon_needle.f90
	
	$ ./a.out
	
	 Variables:
	
	 needle_length =    1.0000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    307.00000000000000     
	
	 prob =   0.307000011    
	
	 pi =    3.2573288713336712     
	
	
	 ./a.out
	
	 Variables:
	
	 needle_length =    1.0000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000000.0000000000     
	
	 hits =    318495.00000000000     
	
	 prob =   0.318495005    
	
	 pi =    3.1397666624028870     
	
	
	 Variables:
	
	 needle_length =    1.0000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000000.0000000000     
	
	 hits =    318495.00000000000     
	
	 prob =   0.318495005    
	
	 pi =    3.1397666624028870     
	
	
	 Variables:
	
	 needle_length =    1.0000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    3184224.0000000000     
	
	 prob =   0.318422407    
	
	 pi =    3.1404825109460139     
	
	
	 Variables:
	
	 needle_length =    1.0000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    3184224.0000000000     
	
	 prob =   0.318422407    
	
	 pi =    3.1404825109460139     
	
	
	 Variables:
	
	 needle_length =    1.0000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    100000000.00000000     
	
	 hits =    31827375.000000000     
	
	 prob =   0.318273753    
	
	 pi =    3.1419493150191089     
	
	
	 Variables:
	
	 needle_length =    1.0000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000000000.0000000     
	
	 hits =    318264400.00000000     
	
	 prob =   0.318264395    
	
	 pi =    3.1420416977668979     
	
	
	 Variables:
	
	 needle_length =    1.0000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    3184224.0000000000     
	
	 prob =   0.318422407    
	
	 pi =    3.1404825109460139     
	
	
	 Variables:
	
	 needle_length =    1.0000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    3184224.0000000000     
	
	 prob =   0.318422407    
	
	 pi =    3.1404825109460139     
	
	
	 Variables:
	
	 needle_length =    1.0000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    3184224.0000000000     
	
	 prob =   0.318422407    
	
	 pi =    3.1404825109460139     
	
	
	 Variables:
	
	 needle_length =    3.1459264755249023     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    7899197.0000000000     
	
	 prob =   0.789919674    
	
	 pi =    3.9825903537955760     
	
	
	 Variables:
	
	 needle_length =    3.1459264755249023     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    7899197.0000000000     
	
	 prob =   0.789919674    
	
	 pi =    3.9825903537955760     
	
	
	 Variables:
	
	 needle_length =   0.50000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    1591568.0000000000     
	
	 prob =   0.159156799    
	
	 pi =    3.1415560136139207     
	
	
	 Variables:
	
	 needle_length =   0.50999999046325684     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    1623147.0000000000     
	
	 prob =   0.162314698    
	
	 pi =    3.1420444139246682     
	
	
	 Variables:
	
	 needle_length =   0.50099998712539673     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    1594630.0000000000     
	
	 prob =   0.159463003    
	
	 pi =    3.1417945029711585     
	
	
	 Variables:
	
	 needle_length =   0.49900001287460327     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    1588442.0000000000     
	
	 prob =   0.158844203    
	
	 pi =    3.1414430253922800     
	
	
	 Variables:
	
	 needle_length =   0.50000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    10000000.000000000     
	
	 hits =    1591568.0000000000     
	
	 prob =   0.159156799    
	
	 pi =    3.1415560136139207     
	
	
	 Variables:
	
	 needle_length =   0.50000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    100000000.00000000     
	
	 hits =    15915599.000000000     
	
	 prob =   0.159155995    
	
	 pi =    3.1415718967288710     
	
	
	 Variables:
	
	 needle_length =   0.50000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000000000.0000000     
	
	 hits =    159123376.00000000     
	
	 prob =   0.159123376    
	
	 pi =    3.1422158863872371     
	
	
	 Variables:
	
	 needle_length =   0.50000000000000000     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    173.00000000000000     
	
	 prob =   0.172999993    
	
	 pi =    2.8901735279051817     
	
	
	 Variables:
	
	 needle_length =   0.69999998807907104     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    228.00000000000000     
	
	 prob =   0.228000000    
	
	 pi =    3.0701753847064808     
	
	
	 Variables:
	
	 needle_length =   0.80000001192092896     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    257.00000000000000     
	
	 prob =   0.256999999    
	
	 pi =    3.1128405219743422     
	
	
	 Variables:
	
	 needle_length =   0.89999997615814209     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    278.00000000000000     
	
	 prob =   0.277999997    
	
	 pi =    3.2374100194980087     
	
	
	 Variables:
	
	 needle_length =   0.85000002384185791     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    267.00000000000000     
	
	 prob =   0.266999990    
	
	 pi =    3.1835208107839317     
	
	
	 Variables:
	
	 needle_length =   0.83999997377395630     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    264.00000000000000     
	
	 prob =   0.263999999    
	
	 pi =    3.1818180997181198     
	
	
	 Variables:
	
	 needle_length =   0.82999998331069946     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    264.00000000000000     
	
	 prob =   0.263999999    
	
	 pi =    3.1439393477581090     
	
	
	 Variables:
	
	 needle_length =   0.81999999284744263     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    262.00000000000000     
	
	 prob =   0.261999995    
	
	 pi =    3.1297710305722921     
	
	
	 Variables:
	
	 needle_length =   0.82499998807907104     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    263.00000000000000     
	
	 prob =   0.263000011    
	
	 pi =    3.1368819474536354     
	
	
	 Variables:
	
	 needle_length =   0.82599997520446777     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    263.00000000000000     
	
	 prob =   0.263000011    
	
	 pi =    3.1406841797041434     
	
	
	 Variables:
	
	 needle_length =   0.82700002193450928     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    264.00000000000000     
	
	 prob =   0.263999999    
	
	 pi =    3.1325758576352083     
	
	
	 Variables:
	
	 needle_length =   0.82499998807907104     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    263.00000000000000     
	
	 prob =   0.263000011    
	
	 pi =    3.1368819474536354     
	
	
	 Variables:
	
	 needle_length =   0.82550001144409180     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    263.00000000000000     
	
	 prob =   0.263000011    
	
	 pi =    3.1387831768956995     
	
	
	 Variables:
	
	 needle_length =   0.82580000162124634     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    263.00000000000000     
	
	 prob =   0.263000011    
	
	 pi =    3.1399238239074898     
	
	
	 Variables:
	
	 needle_length =   0.82609999179840088     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    263.00000000000000     
	
	 prob =   0.263000011    
	
	 pi =    3.1410644709192805     
	
	
	 Variables:
	
	 needle_length =   0.82620000839233398     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    263.00000000000000     
	
	 prob =   0.263000011    
	
	 pi =    3.1414447621344173     
	
	
	 Variables:
	
	 needle_length =   0.82625001668930054     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    263.00000000000000     
	
	 prob =   0.263000011    
	
	 pi =    3.1416349077419858     
	
	
	 Variables:
	
	 needle_length =   0.82624000310897827     
	
	 spacing =    2.0000000000000000     
	
	 trials =    1000.0000000000000     
	
	 hits =    263.00000000000000     
	
	 prob =   0.263000011    
	
	 pi =    3.1415968332937481      
Вывод. Результат расчетов очень сильно зависит от двух параметров- числа бросков и длины иглы (значит и ширины решетки).
Можно за 1000 бросков, как я задал в программе и длине иглы равной 0,82624 получить число Пи с точностью 5 знаков после запятой.
А можно бросить иглу 10 миллионов раз, но с длиной 0,5. И получить немного более точный результат.
При миллиарде бросков результат хуже.
У кого есть время и желание, может подобрать за 1000 бросков большее число цифр после запятой числа Пи.
Это пример обратной некорректной задачи. Мы знаем точно конечный ответ задачи об игле Буффона, и стараемся угадать величины исходных, начальных данных.
Возможно есть формула, которая связывает вид каждой цифры числа Пи после запятой с каждой цифрой после запятой числа длины иглы для заданого числа бросков?
Если есть вопросы, спрашивайте. Текст программы взят из литературы Википедии на английском языке. Но там стоит длина иглы равная 1.
отредактировал(а) marsdmitri: 2023-11-15 22:28 GMT

На Яве есть 3 разные программы.
Кому интересно, скачайте https://www.mediafire.com/file/b6vhgxrqd3dx1c4/MK_simulation_java.zip
https://www.mediafire.com/file/b6vhgxrqd3dx1c4/MK_simulation_java.zip
Мой текст немного искажается сервером, но если не удасться скачать, то напишите адресс куда можно послать.
Главный вывод. Не пытайтесь искать цифры числа Пи таким способом.
Для этого есть намного более точные, не статистические методы.
через неделю выложу простейшие аналогичные программы на си, си++, аccеблере для Линукс.
отредактировал(а) marsdmitri: 2023-10-26 23:46 GMT

 
                			