Mit dem folgenden Code kann ich eine Liste mit Zufallszahlen erstellen, z.B. für den Maximalwert 5:

alt text

Wie könnte ich erreichen, dass alle Zahlen von 1 bis zum Maximalwert genau einmal vorkommen, also im Beispiel von 1 bis 5.

Öffne in Overleaf
%\documentclass[]{article}
\documentclass[border=5mm]{standalone}
\usepackage{amsmath, tikz}

\begin{document}

% Maximalen Zufallswert und Anzahl festlegen
\def\Max{5}
\def\Range{1,...,\Max}
% PermutationsListe erstellen
\newcommand{\PermutationsListe}{}% Name reservieren
\let\PermutationsListe=\empty% Liste erstellen
\makeatletter
\foreach \n  in \Range
{%
\pgfmathparse{random(\Max)}%  <=> random(1,\Max)
  \ifx\empty\PermutationsListe{} \protected@xdef\PermutationsListe{\pgfmathresult}%
  \else \protected@xdef\PermutationsListe{\PermutationsListe,\pgfmathresult}%
  \fi
}\makeatother
Anzeigen: \PermutationsListe

\end{document}

gefragt 05 Mär, 21:19

cis's gravatar image

cis
7.2k12154246
Akzeptiert: 72%


Sowas nennt man auch self-avoiding walk.

Öffne in Overleaf
\documentclass{article}
\usepackage{luacode}

\begin{luacode*}
function saw(n)
   local list = {}
   local seen = {}
   while #list < n do
      local x = math.random(n)
      if not seen[x] then
         list[#list+1] = x
         seen[x] = true
      end
   end
   tex.sprint(table.concat(list,","))
end
\end{luacode*}

\begin{document}

\directlua{saw(5)}

\end{document}

alt text

Falls man die Liste schon hat kann man auch den Knuth Shuffle machen.

Öffne in Overleaf
\documentclass{article}
\usepackage{luacode}

\begin{luacode*}
function shuffle(list)
   for i = #list,2,-1 do
      local j = math.random(i)
      list[i], list[j] = list[j], list[i]
   end
   tex.sprint(table.concat(list,","))
end
\end{luacode*}

\begin{document}

\directlua{shuffle({1,2,3,4,5})}

\end{document}
Permanenter link

beantwortet 05 Mär, 23:31

Henri's gravatar image

Henri
12.9k42536

bearbeitet 06 Mär, 04:19

"Gott segne Lua", würde ich an Deiner Stelle jetzt sagen. Mit Normal-TeX wohl eher nicht...

(06 Mär, 05:15) cis

@cis: Geht schon, wäre aber aufwändiger und langsamer. So könnte man beispielsweise eine clist für die Liste verwenden und jeweils vor dem Einfügen des Zufallselements testen, ob das Element bereits vorhanden ist. Oder man fügt erst einmal n Elemente hinzu, normalisiert die Liste dann, zählt wieviele Elemente fehlen, fügt entsprechend viele hinzu, normalisiert … Ähnliches könnte man auch mit einer etoolbox-Liste machen. Aber irgendwann wird es ja Zeit, sich mal mit l3 zu befassen.

(06 Mär, 07:15) saputello
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×23

Frage gestellt: 05 Mär, 21:19

Frage wurde angeschaut: 249 Mal

Zuletzt aktualisiert: 06 Mär, 07:18