martedì 5 aprile 2011

Calcolo di pi greco in Ruby (con l'ago di quel Buffon)

In sintesi: da 1, 10, 100, 1000 iterazioni, valutare quante volte x (numero casuale compreso tra 0 e 1) supera sin(t)/2 (con t numero casuale compreso tra 0 e pi/2) cioè quante volte l'ago di Buffon "interseca" una delle famose righe del famoso pavimento)

#!/usr/bin/env ruby

[ 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000 ].each do |iter|

  count = 0

  iter.times do |i|
    x = rand
    t = rand * Math::PI / 2.0
    count += 1  if Math.sin(t) > 2*x
  end

  print iter
  print " --> "
  puts iter * 1.0 / count

end

Risultato: il valore "oscilla", ma più si aumentano le iterazioni e più si approssima a pi greco (i numeri pseudocasuali di Ruby sono "abbastanza" casuali: il generatore ha un periodo di 2 alla 19937 meno 1):

1 --> 1.0
10 --> 2.0
100 --> 2.85714285714286
1000 --> 3.15457413249211
10000 --> 3.11526479750779
100000 --> 3.14060488049998
1000000 --> 3.14240104579107
10000000 --> 3.14235759778074

1 commento:

  1. Eh, sì, si approssima a pi greco anche se avrei dovuto usare un rapporto L/a minore di uno anziché esattamente uguale a uno... Ma data l'ora tarda, mi è sfuggito!

    RispondiElimina