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

Пример 9-23. Генерация случайных чисел

Пример 9-23. Генерация случайных чисел

#!/bin/bash

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

# Диапазон изменения: 0 - 32767 (16-битовое целое со знаком).

MAXCOUNT=10

count=1

echo

echo "$MAXCOUNT случайных чисел:"

echo "-----------------"

while [ "$count" -le $MAXCOUNT ] # Генерация 10 ($MAXCOUNT) случайных чисел.

do

number=$RANDOM

echo $number

let "count += 1" # Нарастить счетчик.

done

echo "-----------------"

# Если вам нужны случайные числа не превышающие определенного числа,

# воспользуйтесь оператором деления по модулю (остаток от деления).

RANGE=500

echo

number=$RANDOM

let "number %= $RANGE"

echo "Случайное число меньше $RANGE --- $number"

echo

# Если вы желаете ограничить диапазон "снизу",

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

# пока не получите число большее нижней границы.

FLOOR=200

number=0 # инициализация

while [ "$number" -le $FLOOR ]

do

number=$RANDOM

done

echo "Случайное число, большее $FLOOR --- $number"

echo

# Эти два способа могут быть скомбинированы.

number=0 #initialize

while [ "$number" -le $FLOOR ]

do

number=$RANDOM

let "number %= $RANGE" # Ограничение "сверху" числом $RANGE.

done

echo "Случайное число в диапазоне от $FLOOR до $RANGE --- $number"

echo

# Генерация случайных "true" и "false" значений.

BINARY=2

number=$RANDOM

T=1

let "number %= $BINARY"

# let "number >>= 14" дает более равномерное распределение

# (сдвиг вправо смещает старший бит на нулевую позицию, остальные биты обнуляются).

if [ "$number" -eq $T ]

then

echo "TRUE"

else

echo "FALSE"

fi

echo

# Можно имитировать бросание 2-х игровых кубиков.

SPOTS=7 # остаток от деления на 7 дает диапазон 0 - 6.

ZERO=0

die1=0

die2=0

# Кубики "выбрасываются" раздельно.

while [ "$die1" -eq $ZERO ] # Пока на "кубике" ноль.

do

let "die1 = $RANDOM % $SPOTS" # Имитировать бросок первого кубика.

done

while [ "$die2" -eq $ZERO ]

do

let "die2 = $RANDOM % $SPOTS" # Имитировать бросок второго кубика.

done

let "throw = $die1 + $die2"

echo "Результат броска кубиков = $throw"

echo

exit 0

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


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