# Пример выбора случайного элемента массива.
# Выбор случайной карты из колоды.
suite=($Suites) # Инициализация массивов.
denomination=($Denominations)
num_suites=${#suite[*]} # Количество элементов массивов.
num_denominations=${#denomination[*]}
echo -n "${denomination[$((RANDOM%num_denominations))]} "
echo ${suite[$((RANDOM%num_suites))]}
# Спасибо "jipe," за пояснения по работе с $RANDOM.
Jipe подсказал еще один способ генерации случайных чисел из заданного диапазона.
# Генерация случайных чисел в диапазоне 6 - 30.
# Генерируется случайное число из диапазона 6 - 30,
#+ но при этом число должно делиться на 3 без остатка.
rnumber=$(((RANDOM%30/3+1)*3))
# Упражнение: Попробуйте разобраться с выражением самостоятельно.
Насколько случайны числа, возвращаемые функцией $RANDOM? Лучший способ оценить "случайность" генерируемых чисел -- это написать сценарий, который будет имитировать бросание игрального кубика достаточно большое число раз, а затем выведет количество выпадений каждой из граней...
Пример 9-25. Имитация бросания кубика с помощью RANDOM
# Случайные ли числа возвращает RANDOM?
RANDOM=$$ # Инициализация генератора случайных чисел числом PID процесса-сценария.
PIPS=6 # Кубик имеет 6 граней.
MAXTHROWS=600 # Можете увеличить, если не знаете куда девать свое время.
throw=0 # Счетчик бросков.
zeroes=0 # Обнулить счетчики выпадения отдельных граней.
ones=0 # т.к. неинициализированные переменные - "пустые", и не равны нулю!.
0) let "ones += 1";; # 0 соответствует грани "1".
1) let "twos += 1";; # 1 соответствует грани "2", и так далее
while [ "$throw" -lt "$MAXTHROWS" ]
let "die1 = RANDOM % $PIPS"
# Количество выпадений каждой из граней должно быть примерно одинаковым, если считать RANDOM достаточно случайным.
# Для $MAXTHROWS = 600, каждая грань должна выпасть примерно 100 раз (плюс-минус 20).
# Имейте ввиду, что RANDOM - это генератор ПСЕВДОСЛУЧАЙНЫХ чисел,
# Перепишите этот сценарий так, чтобы он имитировал 1000 бросков монеты.
# На каждом броске возможен один из двух вариантов выпадения - "ОРЕЛ" или "РЕШКА".