![具有不同概率的随机整数](https://linux22.com/image/344595/%E5%85%B7%E6%9C%89%E4%B8%8D%E5%90%8C%E6%A6%82%E7%8E%87%E7%9A%84%E9%9A%8F%E6%9C%BA%E6%95%B4%E6%95%B0.png)
我的新问题是:
假设我想要\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
。
\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/Pseudo-random_number_sampling
创建一个函数,该函数的 x 值从 0 到 1,y 值输出您想要的整数值,符合您想要的分布。然后使用随机数生成器生成一个介于 0 和 1 之间的数字,然后查找函数的值。您的函数可以是一个 100 个元素的数组,其中“x”值乘以 100 并向下舍入...