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

Пример 9-25. Имитация бросания кубика с помощью RANDOM

Пример 9-25. Имитация бросания кубика с помощью RANDOM

#!/bin/bash

# Случайные ли числа возвращает RANDOM?

RANDOM=$$ # Инициализация генератора случайных чисел числом PID процесса-сценария.

PIPS=6 # Кубик имеет 6 граней.

MAXTHROWS=600 # Можете увеличить, если не знаете куда девать свое время.

throw=0 # Счетчик бросков.

zeroes=0 # Обнулить счетчики выпадения отдельных граней.

ones=0 # т.к. неинициализированные переменные - "пустые", и не равны нулю!.

twos=0

threes=0

fours=0

fives=0

sixes=0

print_result ()

{

echo

echo "единиц = $ones"

echo "двоек = $twos"

echo "троек = $threes"

echo "четверок = $fours"

echo "пятерок = $fives"

echo "шестерок = $sixes"

echo

}

update_count()

{

case "$1" in

0) let "ones += 1";; # 0 соответствует грани "1".

1) let "twos += 1";; # 1 соответствует грани "2", и так далее

2) let "threes += 1";;

3) let "fours += 1";;

4) let "fives += 1";;

5) let "sixes += 1";;

esac

}

echo

while [ "$throw" -lt "$MAXTHROWS" ]

do

let "die1 = RANDOM % $PIPS"

update_count $die1

let "throw += 1"

done

print_result

# Количество выпадений каждой из граней должно быть примерно одинаковым, если считать RANDOM достаточно случайным.

# Для $MAXTHROWS = 600, каждая грань должна выпасть примерно 100 раз (плюс-минус 20).

#

# Имейте ввиду, что RANDOM - это генератор ПСЕВДОСЛУЧАЙНЫХ чисел,

# Упражнение:

# ---------------

# Перепишите этот сценарий так, чтобы он имитировал 1000 бросков монеты.

# На каждом броске возможен один из двух вариантов выпадения - "ОРЕЛ" или "РЕШКА".

exit 0

Как видно из последнего примера, неплохо было бы производить переустановку начального числа генератора случайных чисел RANDOM перед тем, как начать работу с ним. Если используется одно и то же начальное число, то генератор RANDOM будет выдавать одну и ту же последовательность чисел. (Это совпадает с поведением функции random() в языке C.)

Оглавление книги


Генерация: 2.407. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз