Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.Python.8-10.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
1.2 Mб
Скачать

Детерминированные генераторы

Детерминированный алгоритм не может генерировать полностью случайные числа, он может только аппроксимировать некоторые их свойства.

Любой ГПСЧ с ограниченными ресурсами рано или поздно зацикливается — начинает повторять одну и ту же последовательность чисел. Если порождаемая ГПСЧ последовательность сходится к слишком коротким циклам, то такой ГПСЧ становится предсказуемым и непригодным для практических приложений.

Большинство простых арифметических генераторов имеют недостатки:

  • Слишком короткий период.

  • Последовательные значения не являются независимыми.

  • Некоторые биты «менее случайны», чем другие.

  • Неравномерное одномерное распределение.

  • Обратимость.

Реализация линейного конгруэнтного метода на Си

unsigned long g_random_seed = 1; //глобальная переменная с последним числом unsigned long my_rand() {     //размер unsigned long равен 4 байта!     //m = 2^32     return g_random_seed = 69069LU*g_random_seed + 5LU; }

Реализация линейного конгруэнтного метода на Python

g_random_seed = 1 def rr():     global g_random_seed     g_random_seed = (69069*g_random_seed+5)%(2**32)

ВОПРОС

Почему в алгоритме на Си отсутствует деление по модулю m, но код работает, а в Python наличие %(2**32)обязательно?

ОТВЕТ

В языке Python реализована длинная арифметика, и целые числа могут быть произвольной длины, а в Си размер числа ограничен количеством бит, отведенных под него.

При этом unsigned long int имеет размер 4 байта — это 32 бита, следовательно результаты операций сложения и умножения в Си для типа unsigned long int и так всегда будут происходить по модулю 232.

Арифметическая и геометрическая прогрессия

Арифметическая прогрессия

Арифметическая прогрессия — числовая последовательность a1,a2,a3,…, в которой каждый член, начиная со второго, есть сумма предыдущего члена и некоторого постоянного числа d, называемого разностью или шагом арифметической прогрессии.

Зная первый член арифметической прогрессии a1 и ее разность d, можно последовательно находить остальные члены с помощью рекуррентного соотношения an+1=an+d, которое вытекает из определения.

Отсюда следует, что арифметическую прогрессию можно представить в виде

a1,a1+d,a1+2∗d,…

ПОСЛЕДОВАТЕЛЬНОСТЬ СУММ АРИФМЕТИЧЕСКОЙ ПРОГРЕССИИ

Сумма первых n членов арифметической прогрессии Sn=a1+a2+a3+… может быть найдена по формулам

Sn=(a1+an)∗n/2 , где a1 — первый член прогрессии, an — член с номером n, n — количество суммируемых членов.

Последовательность сумм также является числовой последовательностью, которая может быть задана рекурсивно.

Геометрическая прогрессия

Геометрическая прогрессия — последовательность чисел b1,b2,b3,… (членов прогрессии), в которой каждое последующее число, начиная со второго, получается из предыдущего умножением его на определённое число q (знаменатель прогрессии), где b1,b2=b1q,b3=b2q,….,bn=bn−1q.

Отладка приложения на Python

Синтаксические ошибки

Синтаксические ошибки во время изучения языка встречаются очень часто. Синтаксический анализатор выводит строку, содержащую ошибку, и указывает место, где ошибка была обнаружена. Ошибка обычно вызвана лексемой, предшествующей стрелке.

Имя файла и номер строки выводится для того, чтобы Вы знали, где искать ошибку в случае, если инструкции считываются из файла.

ПРИМЕР

>>> x***x   File "<stdin>", line 1     x***x        ^ SyntaxError: invalid syntax

Исключения

Даже если инструкция или выражение синтаксически верно, ошибка может произойти при попытке выполнения. Ошибки, обнаруженные во время выполнения, не являются безусловно фатальными, и скоро Вы узнаете, как их можно обрабатывать в программах на языке Python. Большинство исключений, однако, не обрабатываются программами и приводят к сообщениям об ошибке:

>>> 10*(1/0) Traceback (most recent call last):   File "<stdin>", line 1, in <module> ZeroDivisionError: int division or modulo by zero >>> 4 + spam*3 Traceback (most recent call last):   File "<stdin>", line 1, in <module> NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: Can't convert 'int' object to str implicitly

Последняя строка сообщения показывает, что произошло. Исключения бывают разного типа - он выводится в сообщении. Типы исключений в приведенном примере: ZeroDivisionError, NameError и TypeError. Имена стандартных исключений являются встроенными идентификаторами, но не являются зарезервированными ключевыми словами.

Сразу после типа выводятся подробности возникновения исключения. Предшествующая часть сообщения об ошибке показывает контекст возникновения исключительной ситуации в форме содержимого стека. При этом выводятся строки исходного текста, за исключением строк, читаемых со стандартного ввода.