use strict; use warnings; use Statistics::Descriptive; my $n_simulations = 1000; my $circumference = 1000; my @lengths_distrib = (100) x 100; # distibution of range lengths my $some_pos = 36; # arbitrary position my $stat = Statistics::Descriptive::Full->new(); foreach my $sim ( 1 .. $n_simulations ) { # randomly map ranges onto circumference my @random_ranges = map { my $start = int( rand($circumference) ); [ $start, ( $start + $_ -1 ) % $circumference ] } @lengths_distrib; # count how many range contain $some_pos my $num_covering_ranges = scalar( grep { ( $_->[0] <= $some_pos and $_->[1] >= $some_pos ) or ( $_->[1] < $_->[0] and $_->[1] > $some_pos ) } @random_ranges ); $stat->add_data($num_covering_ranges); } print $stat->mean, ' ', $stat->variance, "\n";