
Это продолжениемой последний пост о случайных числах.
Мой новый вопрос:
Допустим, я хочу \n
сгенерировать (своего рода) случайным образом, таким образом, чтобы
\n
=1 10% времени
\n
=2 20% времени
\n
=3 30% времени
\n
=4 40% времени
Этот код делает каждое возможное значение \n
равновероятным. Как мне взвесить вероятности, как указано выше?
\documentclass{minimal}
\setlength\parindent{0pt}
\usepackage{pgffor}
\begin{document}
\pgfmathdeclarerandomlist{choices}{{1}{2}{3}{4}}
\foreach\x in {1,...,50}
{\pgfmathrandomitem{\n}{choices}\n\\}
\end{document}
решение1
Вы могли бы сделать вариацию моего ответа на ваш предыдущий вопрос и вложить три ifthenelse
s.
\documentclass[border=4mm]{article}
\usepackage{pgffor}
\begin{document}
\foreach\x in {1,...,2000} {
\pgfmathsetmacro{\tmp}{rnd}
\pgfmathparse{ifthenelse(\tmp<=0.1,1,ifthenelse(\tmp<=0.3,2,ifthenelse(\tmp<=0.6,3,4)))}\pgfmathresult
}
\end{document}
Заимствую немного из ответа egreg:
\documentclass{article}
\usepackage{pgffor}
\begin{document}
\newcounter{1}\newcounter{2}\newcounter{3}\newcounter{4}
\foreach\x in {1,...,2000} {
\pgfmathsetmacro{\tmp}{rnd}
\pgfmathparse{ifthenelse(\tmp<=0.1,1,ifthenelse(\tmp<=0.3,2,ifthenelse(\tmp<=0.6,3,4)))}\pgfmathresult
\stepcounter{\pgfmathresult}
}
1: \the\value{1}\par
2: \the\value{2}\par
3: \the\value{3}\par
4: \the\value{4}\par
\end{document}
решение2
\documentclass{article}
\usepackage{pgffor}
\newcommand{\myrandom}{%
\expandafter\domyrandom\pdfuniformdeviate 10 \domyrandom
}
\def\domyrandom#1\domyrandom{%
\ifcase#1
1\or
2\or
2\or
3\or
3\or
3\or
4\or
4\or
4\or
4\fi
}
\begin{document}
\foreach \x in {1,...,100}{\myrandom\space}
\newcounter{1}\newcounter{2}\newcounter{3}\newcounter{4}
\foreach \x in {1,...,1000}{\stepcounter{\myrandom}}
1: \the\value{1}\par
2: \the\value{2}\par
3: \the\value{3}\par
4: \the\value{4}\par
\end{document}
решение3
Хотя я уверен, что существует прямой метод генерации целых чисел от 1 до 4, чтобы они имели вероятности 0,1, 0,2, 0,3 и 0,4,косвенныйили двухшаговый метод проще в настройке. Во-первых, сгенерируйте целое число от 1 до 10 случайным образом. (Т.е. каждое целое число имеет P=0.1
.) Во-вторых, проверьте, меньше ли целое число 2, 4 и 7 соответственно, и назначьте числа «1», «2», «3» соответственно — и свяжите число «4» с категорией «ни одно из вышеперечисленных», т.е. если целое число находится между 7 и 10.
Вот реализация этой идеи на основе LuaLaTeX.
\documentclass{article}
\newcommand\x{%
\directlua{x=math.random(10) % draw an integer between 1 and 10
if x<2 then tex.sprint(1) % true if x==1
elseif x<4 then tex.sprint(2) % true if x==2 or 3
elseif x<7 then tex.sprint(3) % true if x==4, 5, or 6
else tex.sprint(4) % true if x==7, 8, 9, or 10
end}}
\begin{document}
\obeylines % just for this example
\x, \x, \x, \x, \x; \x, \x, \x, \x, \x; \x, \x, \x, \x, \x; \x, \x, \x, \x, \x
\x, \x, \x, \x, \x; \x, \x, \x, \x, \x; \x, \x, \x, \x, \x; \x, \x, \x, \x, \x
\x, \x, \x, \x, \x; \x, \x, \x, \x, \x; \x, \x, \x, \x, \x; \x, \x, \x, \x, \x
\x, \x, \x, \x, \x; \x, \x, \x, \x, \x; \x, \x, \x, \x, \x; \x, \x, \x, \x, \x
\end{document}
решение4
https://en.wikipedia.org/wiki/Псевдослучайная_числовая_выборка
создайте функцию, которая имеет значения x от 0 до 1, со значениями y, которые выводят нужные вам целые значения в нужном вам распределении. Затем используйте генератор случайных чисел, чтобы получить число от 0 до 1, а затем найдите значение вашей функции. Ваша функция может быть массивом из 100 элементов, в котором значение "x" умножается на 100 и округляется вниз...