Чтение онлайн

на главную

Жанры

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

#+ то отношение попаданий в воду к общему числу выстрелов будет примерно равно

#+ значению PI/4.

#

# По той простой причине, что стрельба фактически ведется только

#+ по правому верхнему квадранту карты.

# (Предыдущее описание было несколько упрощено.)

#

# Теоретически, чем больше будет произведено

выстрелов, тем точнее будет результат.

# Однако, сценарий на языке командной оболочки, в отличие от других языков программирования,

#+ в которых доступны операции с плавающей запятой, имеет некоторые ограничения.

# К сожалению, это делает вычисления менее точными.

DIMENSION=10000 # Длина стороны квадратного участка поверхности.

# Он же -- верхний предел для генератора случайных чисел.

MAXSHOTS=1000 # Количество выстрелов.

# 10000 выстрелов (или больше) даст лучший результат,

# но потребует значительного количества времени.

PMULTIPLIER=4.0 # Масштабирующий коэффициент.

get_random

{

SEED=$(head -1 /dev/urandom | od -N 1 | awk '{ print $2 }')

RANDOM=$SEED # Из примера "seeding-random.sh"

let "rnum = $RANDOM % $DIMENSION" # Число не более чем 10000.

echo $rnum

}

distance= # Объявление глобальной переменной.

hypotenuse # Расчет гипотенузы прямоугольного треугольника.

{ # Из примера "alt-bc.sh".

distance=$(bc -l << EOF

scale = 0

sqrt ( $1 * $1 + $2 * $2 )

EOF

)

# Установка "scale" в ноль приводит к округлению результата "вниз",

#+ это и есть то самое ограничение, накладываемое командной оболочкой.

# Что, к сожалению, снижает точность аппроксимации.

}

# main {

# Инициализация переменных.

shots=0

splashes=0

thuds=0

Pi=0

while [ "$shots" -lt "$MAXSHOTS" ] #

Главный цикл.

do

xCoord=$(get_random) # Получить случайные координаты X и Y.

yCoord=$(get_random)

hypotenuse $xCoord $yCoord # Гипотенуза = расстоянию.

((shots++))

printf "#%4d " $shots

printf "Xc = %4d " $xCoord

printf "Yc = %4d " $yCoord

printf "Distance = %5d " $distance # Растояние от

#+ центра озера,

#+ с координатами (0,0).

if [ "$distance" -le "$DIMENSION" ]

then

echo -n "ШЛЕП! " # попадание в озеро

((splashes++))

else

echo -n "БУХ! " # попадание на твердую почву

((thuds++))

fi

Pi=$(echo "scale=9; $PMULTIPLIER*$splashes/$shots" | bc)

# Умножение на коэффициент 4.0.

echo -n "PI ~ $Pi"

echo

done

echo

echo "После $shots выстрела, примерное значение числа \"пи\" равно $Pi."

# Имеет тенденцию к завышению...

# Вероятно из-за ошибок округления и несовершенства генератора случайных чисел.

echo

# }

exit 0

# Самое время задуматься над тем, является ли сценарий удобным средством

#+ для выполнения большого количества столь сложных вычислений.

#

# Тем не менее, этот пример может расцениваться как

# 1) Доказательство возможностей языка командной оболочки.

# 2) Прототип для "обкатки" алгоритма перед тем как перенести

#+ его на высокоуровневые языки программирования компилирующего типа.

Поделиться:
Популярные книги

Замуж второй раз, или Ещё посмотрим, кто из нас попал!

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Замуж второй раз, или Ещё посмотрим, кто из нас попал!

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Сердце Дракона. Том 11

Клеванский Кирилл Сергеевич
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Сердце Дракона. Том 11

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Шесть принцев для мисс Недотроги

Суббота Светлана
3. Мисс Недотрога
Фантастика:
фэнтези
7.92
рейтинг книги
Шесть принцев для мисс Недотроги

Хочу тебя любить

Тодорова Елена
Любовные романы:
современные любовные романы
5.67
рейтинг книги
Хочу тебя любить

Огни Аль-Тура. Желанная

Макушева Магда
3. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.25
рейтинг книги
Огни Аль-Тура. Желанная

Начальник милиции 2

Дамиров Рафаэль
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции 2

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Сумеречный стрелок 8

Карелин Сергей Витальевич
8. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Сумеречный стрелок 8

Я до сих пор не князь. Книга XVI

Дрейк Сириус
16. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я до сих пор не князь. Книга XVI

Обыкновенные ведьмы средней полосы

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Обыкновенные ведьмы средней полосы

Метаморфозы Катрин

Ром Полина
Фантастика:
фэнтези
8.26
рейтинг книги
Метаморфозы Катрин

Идеальный мир для Социопата

Сапфир Олег
1. Социопат
Фантастика:
боевая фантастика
рпг
постапокалипсис
6.17
рейтинг книги
Идеальный мир для Социопата