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 06 Mär '18, 03:19

cis's gravatar image

cis
9.5k93459491
Akzeptiert-Rate: 29%


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 06 Mär '18, 05:31

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 06 Mär '18, 10:19

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

(06 Mär '18, 11: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 '18, 13:15) saputello
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×27

gestellte Frage: 06 Mär '18, 03:19

Frage wurde gesehen: 4,751 Mal

zuletzt geändert: 06 Mär '18, 13:18