
Dies ist eine Fortsetzung vonmein letzter Beitrag zu Zufallszahlen.
Meine neue Frage ist:
Angenommen, ich möchte \n
(mehr oder weniger) zufällig generieren, so dass
\n
=1 10% der Zeit
\n
=2 20% der Zeit
\n
=3 30% der Zeit
\n
=4 40% der Zeit
Dieser Code macht jeden möglichen Wert \n
gleich wahrscheinlich. Wie gewichte ich die Wahrscheinlichkeiten wie oben aufgeführt?
\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}
Antwort1
Sie könnten meine Antwort auf Ihre vorherige Frage variieren und drei ifthenelse
s einfügen.
\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}
Um etwas aus Egregs Antwort zu zitieren:
\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}
Antwort2
\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}
Antwort3
Ich bin mir zwar sicher, dass es eine direkte Methode gibt, um Ganzzahlen von 1 bis 4 zu generieren, sodass sie die Wahrscheinlichkeiten 0,1, 0,2, 0,3 und 0,4 haben, aberindirektoder die Zwei-Schritt-Methode ist einfacher einzurichten. Generieren Sie zunächst zufällig eine Ganzzahl zwischen 1 und 10. (Das heißt, jede Ganzzahl hat P=0.1
.) Überprüfen Sie dann, ob die Ganzzahl kleiner als 2, 4 bzw. 7 ist, und weisen Sie die Zahlen „1“, „2“, „3“ entsprechend zu – und ordnen Sie die Zahl „4“ der Kategorie „keine der oben genannten“ zu, d. h. wenn die Ganzzahl zwischen 7 und 10 liegt.
Hier ist eine LuaLaTeX-basierte Implementierung dieser Idee.
\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}
Antwort4
https://en.wikipedia.org/wiki/Pseudozufallszahlen-Stichproben
Erstellen Sie eine Funktion mit x-Werten von 0 bis 1 und y-Werten, die die gewünschten ganzzahligen Werte in der gewünschten Verteilung ausgeben. Verwenden Sie dann einen Zufallszahlengenerator, um eine Zahl zwischen 0 und 1 zu erzeugen, und suchen Sie dann den Wert Ihrer Funktion. Ihre Funktion kann ein Array mit 100 Elementen sein, in dem der „x“-Wert mit 100 multipliziert und abgerundet wird …