Установить случайное начальное число для документа PythonTeX - PullRequest
0 голосов
/ 09 июля 2020

Я инструктор по физике и хотел бы использовать PythonTeX для написания задач в LaTeX со случайными значениями.

Я хочу запустить pythontex3.py в документе и получить новый набор случайных значений. Из того, что я могу сказать, модуль python random выберет начальное число из системных часов (таким образом вы не всегда будете получать одинаковый набор случайных чисел при запуске python).

Однако pythontex3. py, похоже, всегда начинается с одного и того же начального числа, тем самым каждый раз генерируя одни и те же псевдослучайные числа.

Вот MWE

    \documentclass{exam}
    \usepackage{pythontex}

    \begin{document}
    \begin{pycode}
    import random
    # Create large number with 3 significant digits
    Number=random.randint(100,1000)*1000
    \end{pycode}
    
    \begin{questions}
    \question
    The number \pyc{print(Number)} in scientific notation is
    \begin{choices}
        \CorrectChoice \pyc{print('%.2E' % Number)}
        \choice \pyc{print('%.2E' % (Number*1*10**random.randint(-10,-5)))}
        \choice \pyc{print('%.2E' % (Number*1*10**random.randint(-5,0)))}
        \choice \pyc{print('%.2E' % (Number*1*10**random.randint(5,10)))}
    \end{choices}
    \end{questions}
    \end{document}

, который генерирует следующее на моей машине. Скриншот PDF

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Решение состоит в том, чтобы установить случайное начальное число с временем вашей системы, а затем указать pythontex всегда запускать код python. По умолчанию pythontex будет обновляться, только если код python изменился с момента последней компиляции.

\documentclass{exam}
\usepackage{pythontex}

\begin{document}
\begin{pycode}
import random
# Set seed by clock's microsecond so that each 
# compilation will give new random values
from datetime import datetime
now=datetime.now()
# Manually set seed if reproducible sequence is desired
random.seed(now.microsecond)
# Create large number with 3 significant digits
Number=random.randint(100,1000)*1000
\end{pycode}
\begin{questions}
\question
The number \pyc{print(Number)} in scientific notation is
\begin{choices}
    \CorrectChoice \pyc{print('%.2E' % Number)}
    \choice \pyc{print('%.2E' % (Number*1*10**random.randint(-10,-5)))}
    \choice \pyc{print('%.2E' % (Number*1*10**random.randint(-5,0)))}
    \choice \pyc{print('%.2E' % (Number*1*10**random.randint(5,10)))}
\end{choices}
\end{questions}
\end{document}

Затем скомпилируйте с

pdflatex MWE.tex; pythontex3 --runall = true MWE.tex; pdflatex MWE.tex

1 голос
/ 09 июля 2020

почему вы не предоставляете случайное начальное число явно в своем коде?

random.seed() # use system time as a randomness source

или вы можете сгенерировать воспроизводимую последовательность, используя

random.seed(2345)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...