Кроссплатформенность и bc
Как мы все знаем, в мире существует две версии bc — более скромная по возможностям версия GNU, которая используется в Линуксе, и более развитая, которая, например, используется в командной строке МакОСи.
Они довольно серьёзно различаются — когда я писал игру «Виселица» на этом языке, мне пришлось сделать две версии для разных синтаксисов.
В принципе, можно писать кроссплатформенно, если использовать подмножество, которое поддерживают обе версии, но есть одна неприятность — функция получения случайного числа
Поскольку в языке нет способа узнать определена функция или нет, нужно
Каким же образом мы можем это сделать?
Вначале я возлагал надежду на переменную seed. В GNU её нету, то есть она содержит ноль, а в продвинутой версии она содержит инициализирующее значение. Как будто этого вполне достаточно, но,
Такую особенность я нашёл — она заключается в приоритете обработки операции отрицания, которая записывается как восклицательный знак.
Основываясь на этом, мы можем написать универсальную функцию для получения случайного числа:
define rnd() {
/* Checking the bc version */
if (!1+1) {
return rand()
} else {
return random() * random()
}
}P. S. Надо помнить, что
P. P. S. Я умножаю random() на random(), чтобы хоть немного выровнять по диапазону значений rand() и random(), правда распределение, конечно, изменится.
Комментарии 12
впрочем неважно — допустим, от 0 до 32767 — вопрос на засыпку — при таком умножении — равновероятны ли значения 32767² и 0? )