From 080d71d0db99735e8a238b854ae90a8ea41ae1e1 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Thu, 14 Nov 2024 16:12:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=B5=D0=B7=D0=BC=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=D0=B4=D0=BD=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BF=D0=B0=D0=BF=D0=BE=D1=80=D0=BE=D1=82=D0=BD=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B2=20=D0=BE=D1=82=D1=87=D1=91=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab2/report/report.tex | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/lab2/report/report.tex b/lab2/report/report.tex index 26d9770..3c2d178 100644 --- a/lab2/report/report.tex +++ b/lab2/report/report.tex @@ -311,10 +311,10 @@ \subsubsection{Генерация новой точки} - Генерация новой точки происходит с помощью функции \texttt{genNextPoint} и вспомогательной функции \texttt{applyTransformation}, код которых представлен в листинге~\ref{lst:genDot}. \texttt{applyTransformation} принимает на вход исходную точку и случайное число от 0 до 1, затем выбирает и применяет к точке трансформацию в соответствии с заданными вероятностями, и возвращает новую точку. \texttt{genNextPoint} принимает на вход исходную точку, генерирует случайное число от 0 до 1, применяет функцию \texttt{applyTransformation} и возвращает новую точку. + Генерация новой точки происходит с помощью функции \texttt{genNextPoint} и вспомогательной функции \texttt{applyTransformation}, код которых представлен в листинге~\ref{lst:genDot}. \texttt{applyTransformation} принимает на вход исходную точку и случайное число от 0 до 1, затем выбирает и применяет к точке трансформацию в соответствии с заданными вероятностями, и возвращает новую точку. \texttt{genNextPoint} принимает на вход исходную точку и состояние генератора случайных чисел -- \texttt{gen}, генерирует случайное число от 0 до 1, применяет функцию \texttt{applyTransformation} и возвращает пару -- новую точку и новое состояние генератора случайных чисел. \begin{lstlisting}[caption={Код функций для генераций новых точек в папоротнике Барнсли.}, label={lst:genDot}] - import System.Random (randomRIO) + import System.Random (StdGen, mkStdGen, randomR) applyTransformation :: Point -> Float -> Point applyTransformation point random @@ -322,25 +322,24 @@ | random < 0.86 = transformation2 point | random < 0.93 = transformation3 point | otherwise = transformation4 point - - genNextPoint :: Point -> IO Point - genNextPoint point = do - random <- randomRIO (0.0, 1.0 :: Float) - return $ applyTransformation point random - \end{lstlisting} + + genNextPoint :: StdGen -> Point -> (Point, StdGen) + genNextPoint gen point = + let (random, newGen) = randomR (0.0, 1.0 :: Float) gen + in (applyTransformation point random, newGen) +\end{lstlisting} \subsubsection{Рекурсивная генерация папоротника Барнсли} - Функция \texttt{barnsleyFern}, код которой представлен в листинге~\ref{lst:barnsleyFern}, реализует рекурсивный алгоритм генерации списка точек, из которых состоит папоротник Барнсли. Функция принимает на вход начальную точку и число -- количество шагов рекурсии, а возвращает список точек папоротника Барнсли. + Функция \texttt{barnsleyFern}, код которой представлен в листинге~\ref{lst:barnsleyFern}, реализует рекурсивный алгоритм генерации списка точек, из которых состоит папоротник Барнсли. Функция принимает на вход текущее состояние генератора случайных чисел, начальную точку и число -- количество шагов рекурсии, а возвращает список точек папоротника Барнсли. \begin{lstlisting}[caption={Код функции для построения папоротника Барнсли.}, label={lst:barnsleyFern}] - barnsleyFern :: Point -> Int -> IO [Point] - barnsleyFern _ 0 = return [] - barnsleyFern startPoint n = do - x' <- genNextPoint startPoint - xs <- barnsleyFern x' (n - 1) - return (startPoint : xs) - \end{lstlisting} + barnsleyFern :: StdGen -> Point -> Int -> [Point] + barnsleyFern _ _ 0 = [] + barnsleyFern gen startPoint n = + let (nextPoint, newGen) = genNextPoint gen startPoint + in startPoint : barnsleyFern newGen nextPoint (n - 1) +\end{lstlisting} \subsection{Повторяющаяся дилемма заключённого}