Batch Zahlen nach Reihenfolge sortieren?

3 Antworten

...damit wärst Du an dem Punkt angelangt an dem Batch keine einfach zu handhabende Sprache mehr ist...

Batch ist nicht wirklich für die Arbeit mit Zahlen geschaffen und spatestens wen es ans sortieren und der gleichen geht beikommst Du die volle "Breitseite" , nicht jeder Befehl kann Daten über die Pipe weitergeben (for und call können es offiziell nicht, wie es ginge möchtest Du nicht wissen...)... dann bleib nur eine Hilfsdatei...

demo.cmd

@echo off
setlocal enableDelayedExpansion
 rem erzeuge 20 Zufalszahlen und speicher die Ausgabe in eine Datei (den Output eines for-loop kann man nicht über eiene Pipe weiterreichen)
(for /l %%a in (1,1,20) do @(
   rem es gibt in Batch keine größere Zufallszahl als 32767
   rem Batch kan nur Strings sortieren, also muss dafür gesorgt werden das die zu sortierenden ZahlenStrings das gleich format haben (führende Nullen etc.)
   rem das geht ganz einfach, indem wir die zufallszahl einfach zu zB 1000000 hinzuadieren
  set /a "Rand=1000000+!random!"
  echo !Rand!
))>"myRandoms.txt"
 rem mal anzeigen
type "myRandoms.txt"
echo:
echo Datei mal sortiert anzeigen:
sort "myRandoms.txt"
echo:

 rem jetzt lesen wir die Nummern aus der Datei sortiert in ein Array und entfernen auch gleich die 1000000
set "index=1"
for /f "tokens=*" %%a in ('sort "myRandoms.txt"') do (
  set /a "sortedRandom.!index!=%%a - 1000000" 
   rem mal anzeigen (geschachtelte dynamische Variablennamen sind in Batch echt Kacke auszugeben)
  call echo %%sortedRandom.!index!%%
  set /a "index+=1"
)

 rem jetzt kannst du auch auf die Variablen zugreifen
echo Kleinste Zufallszahl : %sortedRandom.1%
echo dazwischen:
for /l %%a in (2,1,19) do (
  echo !sortedRandom.%%a!
)

echo Groesste Zufallszahl : %sortedRandom.20%
pause
...und genau derartige Monster sind der Grund, weshalb Batch von Poweshell abgelöst wird/wurde...

Die ganze Nummer sähe in Powershell s aus...

einfach 20 Zufallszahlen erzeugen und sortieren:

1..20|ForEach-Object{Get-Random}|Sort-Object
  #oder  kurz:
1..20|%{Get-Random}|sort

willst Du die Lottozahlen sollte keine Zahl doppelt anfallen, dan geht man etwas anders vor

lotto.ps1

#wähle  6 zufällige  Zahlen aus eine Aufzählung von 1 bis 49...
1..49|Get-Random -count 6|sort
pause

Vergiss einfach Batch, wenn Du nicht gerade irgendwelche masochistischen "Kraftproben" mit dieser störrischen Sprache bestehen möchtest.

Wende dich der Zukunft zu und nutze für Kleinkram Powershell...

wenn Dich das starten eine Powershellscripts per rechtsklick stört kanst du es in eine Batch "verpacken":

Als Einzeiler :

lotto.cmd

@echo off
powershell -c "Write-Host 'Deine Lotozahlen:' -fo green; 1..49|Get-Random -count 6|sort"
pause

oder als Hybridscript (wenn's für einen Einzeiler zu komplex wird):

Hybrid.cmd

<# : Batch Abschnitt ,Batch sieht in dieser Zeile die Eingabe aus der Datei # an ein SprungLabel, Powershell sieht den begin eines Kommentars. 
@echo off
powershell "iex (gc '%~f0' -Encoding UTF8 -ReadCount 0 | out-string)"
exit /b
: Ende Batch und Powershellkommentar #>


$MyLotoZahlen=1..49|Get-Random -count 6
Write-Host 'Deine Lotozahlen wie gezogen:' -fo green
$MyLotoZahlen
Write-Host '...dito sortiert:' -fo green
$MyLotoZahlen|sort
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Eine Quick-and-Dirty-Methode wäre, die Zahlen alle mit führenden Nullen aufzufüllen, in eine Datei zu schreiben und dann mit SORT die Datei zu sortieren.

Eine bestimmte Zeile kann man mit FOR /F, "skip=%nk%" und ein paar Tricks mit IF u. Ä. auslesen.

Woher ich das weiß:Berufserfahrung – Software-Entwickler
Erzesel  18.08.2022, 12:19

Warum die Eierei mit führenden Nullen? einfach jeweils zur gleichen großen Zahl addieren sortieren und anschließend diese große Zahl wieder subtrahieren...

0
PWolff  18.08.2022, 12:47
@Erzesel

Stimmt, das wäre eine andere Möglichkeit. Dass man damit über 2^31-1 (oder was immer im Moment der maximal verwendbare Wert ist) kommt, ist unwahrscheinlich.

0