قاعدتا باید یک جایگشت تصادفی از اعداد از یک تا چهار داشته باشیم. سواد من از دستورات لاتک کم است و پاسخ اینجا وصله پینه از پاسخ آقا وحید در پرسش http://qa.parsilatex.com/1918 و این پرسش و پاسخ است که احتمالا دوستان بتوانند پاسخ را بهتر کنند. در واقع کافیست به جای تولید جوابها به ترتیب اولیه، یک جایگشت تصادفی از آنها را داشته باشیم.
بر اساس این پرسش و پاسخ کد زیر را به commands آقا وحید اضافه کردم :
\def\pgfmathrandomitemwithoutreplacement#1#2{%
\pgfmath@ifundefined{pgfmath@randomlist@#2}{\pgfmath@error{Unknown random list `#2'}}{%
\edef\pgfmath@randomlistlength{\csname pgfmath@randomlist@#2\endcsname}%
\ifnum\pgfmath@randomlistlength>0\relax%
\pgfmathrandominteger{\pgfmath@randomtemp}{1}{\pgfmath@randomlistlength}%
\def\pgfmath@marshal{\def#1}%
\expandafter\expandafter\expandafter\pgfmath@marshal\expandafter\expandafter\expandafter{\csname pgfmath@randomlist@#2@\pgfmath@randomtemp\endcsname}%
% Now prune.
\c@pgfmath@counta=\pgfmath@randomtemp\relax%
\c@pgfmath@countb=\c@pgfmath@counta%
\advance\c@pgfmath@countb by1\relax%
\pgfmathloop%
\ifnum\c@pgfmath@counta=\pgfmath@randomlistlength\relax%
\else%
\def\pgfmath@marshal{\expandafter\global\expandafter\let\csname pgfmath@randomlist@#2@\the\c@pgfmath@counta\endcsname=}%
\expandafter\pgfmath@marshal\csname pgfmath@randomlist@#2@\the\c@pgfmath@countb\endcsname%
\advance\c@pgfmath@counta by1\relax%
\advance\c@pgfmath@countb by1\relax%
\repeatpgfmathloop%
\advance\c@pgfmath@counta by-1\relax%
\expandafter\xdef\csname pgfmath@randomlist@#2\endcsname{\the\c@pgfmath@counta}%
\else%
\pgfmath@error{Random list `#2' is empty}%
\fi%
}}
\def\pgfmathrandomlistcopy#1#2{%
\pgfmath@ifundefined{pgfmath@randomlist@#2}{\pgfmath@error{Unknown random list `#2'}}{%
\edef\pgfmath@randomlistlength{\csname pgfmath@randomlist@#2\endcsname}%
\pgfmathloop%
\ifnum\pgfmathcounter>\pgfmath@randomlistlength\relax%
\else%
\def\pgfmath@marshal{\expandafter\global\expandafter\let\csname pgfmath@randomlist@#1@\pgfmathcounter\endcsname=}%
\expandafter\pgfmath@marshal\csname pgfmath@randomlist@#2@\pgfmathcounter\endcsname%
\repeatpgfmathloop%
\expandafter\xdef\csname pgfmath@randomlist@#1\endcsname{\pgfmath@randomlistlength}%
}%
}
و بخش انتخاب جواب را از این حالت:
\newcommand{\answer}[4]{%
\sbox\answera{#1}%
\sbox\answerb{#2}%
\sbox\answerc{#3}%
\sbox\answerd{#4}% ...
به صورت زیر تغییر دادم که جایگشتی از چهار عدد ۱ تا چهار داشته باشم و به ازای هر عنصر، یک پاسخ انتخاب شود:
\newcommand{\answer}[4]{%
\pgfmathdeclarerandomlist{some numbers}{{1}{2}{3}{4}}
\pgfmathrandomlistcopy{tmp}{some numbers}
\pgfmathrandomitemwithoutreplacement\j{tmp}
\sbox\answera{\ifcase\j\relax\or#1\or#2\or#3\or#4\fi}%
\pgfmathrandomitemwithoutreplacement\j{tmp}
\sbox\answerb{\ifcase\j\relax\or#1\or#2\or#3\or#4\fi}%
\pgfmathrandomitemwithoutreplacement\j{tmp}
\sbox\answerc{\ifcase\j\relax\or#1\or#2\or#3\or#4\fi}%
\pgfmathrandomitemwithoutreplacement\j{tmp}
\sbox\answerd{\ifcase\j\relax\or#1\or#2\or#3\or#4\fi}%...
حال با هر بار اجرای برنامه اصلی آقا وحید، پرسشهایی به صورت تصادفی انتخاب میشوند که چهار پاسخ هر یک با ترتیبی تصادفی ظاهر میشوند. به عنوان مثال خروجی دو بار اجرای برنامه آقا وحید بر روی یک بانک یک سؤالی به صورت زیر است:
فایلهای مرتبط را میتوانید از اینجــــــا دانلود نمایید. فایلهای اصلاح شده با نامهای commandsPerm و rootPerm هستند.