Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch Zufallszahl an jede Zeile hängen

Frage Entwicklung Batch & Shell

Mitglied: Garuga

Garuga (Level 1) - Jetzt verbinden

01.06.2011 um 14:14 Uhr, 5430 Aufrufe, 8 Kommentare

Hi, ich habe nicht wirklich viel Ahnung aber glaube das meine Arbeit mit einem Batch programm etwas leichter werden würde.

Ich habe eine Datei (test.txt) mit mehreren hundert Zeilen. An das ende jeder Zeile soll einfach nur ein string angeheftet werden die wie folgt aufgebaut ist:
" 1 2 3 Zufallszahl_zwischen_Null_und_zwei_PI Zufallszahl_zwischen_Null_und_zwei_PI Zufallszahl_zwischen_Null_und_zwei_PI"

Sieht komplizierter aus als es ist. Daher nochmal kurz in worten wie der String aufgebaut werden soll:
1. ein Leerzeichen anhängen
2. die Zahl 1 anhängen
3. ein Leerzeichen anhängen
4. die Zahl 2 anhängen
5. ein Leerzeichen anhängen
6. die Zahl 3 anhängen
7. ein Leerzeichen anhängen
8. Eine Zufallszahl anhängen die zwischen 0 und 2*PI liegt. (Sollte batch keinen solchen Zufallsgenerator haben(Komma Zahl) geht natürlich auch eine Berechnung in der Art:
Random(0,20000) * 3,14159 / 10000)
9. ein Leerzeichen anhängen
10. Eine ANDERE Zufallszahl anhängen die zwischen 0 und 2*PI liegt.
11. ein Leerzeichen anhängen
12. Eine ANDERE Zufallszahl anhängen die zwischen 0 und 2*PI liegt.


Jede der zufallszahlen soll antürlich neu berechnet werden.
Das wars auch schon

Mit freundlichen Grüßen
Mitglied: Snowman25
01.06.2011 um 15:00 Uhr
Hallo Garuga,

ein paar Verständnisfragen:

Wieviele Nachkommastellen soll diese Zufallszahl haben?
Ist das Komma ein Komma oder ein Punkt?
Hat dein Dokument Leerzeilen, und was soll mit diesen geschehen? Am einfachsten wäre es, sie rausfallen zu lassen

Gruß
Snow
Bitte warten ..
Mitglied: Garuga
01.06.2011 um 15:14 Uhr
Zitat von Snowman25:
Hallo Garuga,

ein paar Verständnisfragen:

Wieviele Nachkommastellen soll diese Zufallszahl haben?
Ist das Komma ein Komma oder ein Punkt?
Hat dein Dokument Leerzeilen, und was soll mit diesen geschehen? Am einfachsten wäre es, sie rausfallen zu lassen

Gruß
Snow

Oha, wenn es so genau geht:
8 Nachkommastellen
Ein Punkt wäre toll
Das Dokument hat keine leerzeilen, lediglich die letzte Zeile ist eine Leerzeile, ob die nun da bleibt oder nicht ist egal, die kann ich per Hand wieder einfügen

Mit freundlichen Grüßen
Bitte warten ..
Mitglied: Snowman25
01.06.2011 um 15:48 Uhr
Hallo Garuga,

probier mal folgendes Skript aus:
01.
@Echo off 
02.
setlocal EnableDelayedExpansion  
03.
set input=test.txt 
04.
set output=out.txt 
05.
set trennzeichen=. 
06.
 
07.
for /F "delims=" %%a in (%input%) do ( 
08.
	set "step=" 
09.
	call :getran 
10.
	set step=%%a 1 2 3 !erg! 
11.
	call :getran 
12.
	set step=!step! !erg! 
13.
	call :getran 
14.
	set step=!step! !erg! 
15.
	Echo !step!>>%output% 
16.
17.
 
18.
 
19.
 
20.
goto :eof 
21.
 
22.
:getran 
23.
set ran=%random%%random% 
24.
set ran=%ran:~0,10% 
25.
 
26.
if %ran% LSS 0 ( 
27.
	set /a ran=%ran% * -1 
28.
29.
 
30.
set /a zwerg=%ran% %% 628318530 
31.
if %zwerg% LSS 0 ( 
32.
	set /a zwerg=%zwerg% * -1 
33.
34.
 
35.
set zwerg=000000000%zwerg% 
36.
set erg=%zwerg:~-9,1%%trennzeichen%%zwerg:~-8,99% 
37.
goto :eof 
38.
 
39.
 
40.
:eof
Hast Glück mit den 8 Nachkommastellen. Mehr kann ich auf diese Weise nämlich garnicht erstellen.
Ich weiss leider nicht, wie gut die Ergebnisse verteilt sind, aber sie sind auf jeden Fall zwischen 0 und 2Pi.
Wie du siehst, war es nicht einfach, die Zahlen passend heraus zu bekommen, da Batch nicht mit Kommazahlen rechnen kann.
Deshalb musste ich mit Vielfachen rechnen, die Zahl als String erweitern und dann entsprechend auseinanderschneiden und wieder zusammenkleben.
Und falls du dich über die Zeilen mit X * -1 wunderst: Die Zahlen sind so groß, dass das erste Bit gelegentlich wechselt und die Zahl negativ wird.

Gruß
Snow
Bitte warten ..
Mitglied: Garuga
01.06.2011 um 15:58 Uhr
Vielen dank snow, geht auf Anhieb!

Was meisnt du damit das du nicht weist wie die Verteilung ist? Leider ist Batch nicht wirklich gut menschenlesbar, aber als grundfunktion scheinst du ja die random funktion von batch zu nutzen, und die sollte doch (hoffentlich) mathematisch korrekte zufallsverteilung liefern.
Bitte warten ..
Mitglied: Snowman25
01.06.2011 um 16:11 Uhr
Die Funktion, die eine Zufallszahl für %random% auswirft, erzeugt schon relativ gut verteilte Ergebnisse:
13941	25445	9323	25733	19111 
21797	11884	27142	3038	26515 
4905	3316	16349	17526	9251 
11361	3777	25478	27133	7925 
25316	31429	9089	17887	2 
18707	13796	19473	5530	28413
Bloß kann ich dir nicht sagen, wie es um die gleichmäßige Verteilung meines Algorithmus steht.
Um in dir mal zu erklären:
  1. 2 %random%-Zahlen werden hintereinandergeschrieben und dann auf 10 Zahlen gekürzt.
  2. Sollte das Ergebnis aus irgendeinem Grund negativ sein, wird es positiv gemacht.
  3. Jetzt wird dieser Wert mit 62831853 (2*Pi*100.000.000) Modulo gerechnet
  4. Sollte das Ergebnis aus irgendeinem Grund negativ sein, wird es positiv gemacht.
  5. Jetzt werden vorne mehrere Nullen angehängt, um eine Mindestlänge zu garantieren
  6. Dann wird die 9. Ziffer von hinten, ein Trennzeichen und die restlichen Zahlen in eine Variable geschrieben, welche unser Endergebnis darstellt.

Auf Grund dessen kann ich keine valide Zufallsverteilung garantieren.
Bitte warten ..
Mitglied: Garuga
01.06.2011 um 16:16 Uhr
OK, verstehe das vorgehen, und bei einer sehr langen datei kam es zu folgender fehlermeldung:

"ungültige Zahl". Zahlen sind begrenzt auf eine Genauigkeit von 32 bits


Wäre es leichter, wenn du die genauigkeit auf 6 stellen machst? Und anscheinend verarbeitet mein Rechner die zahlen zu schnell, denn es kommen öfters zahlen doppelt vor, hier ein kleiner ausschnitt:

... 1 2 3 1.38776408 0.94693388 0.94693388
... 1 2 3 0.94693388 1.59142789 1.59142789
... 1 2 3 2.03932151 2.03932151 2.03932151

Kann man da eine pause einbauen? Ich denke er nimmt als grundsatz irgendeine zeitrechnung und kommt daher auf stets gleiche werte.
Bitte warten ..
Mitglied: Snowman25
01.06.2011 um 16:25 Uhr
Die Verzögerung ist einfach zu realisieren. Genauso wie die Reduzierung auf 6 Nachkommastellen. Hier die neue Version:

01.
@Echo off 
02.
setlocal EnableDelayedExpansion  
03.
set input=test.txt 
04.
set output=out.txt 
05.
set trennzeichen=. 
06.
 
07.
for /F "delims=" %%a in (%input%) do ( 
08.
	set "step=" 
09.
	call :getran 
10.
	set step=%%a 1 2 3 !erg! 
11.
	call :getran 
12.
	set step=!step! !erg! 
13.
	call :getran 
14.
	set step=!step! !erg! 
15.
	Echo !step!>>%output% 
16.
17.
 
18.
 
19.
 
20.
goto :eof 
21.
 
22.
:getran 
23.
ping -n 1 localhost>nul 
24.
set ran=%random%%random% 
25.
set ran=%ran:~0,8% 
26.
 
27.
if %ran% LSS 0 ( 
28.
	set /a ran=%ran% * -1 
29.
30.
 
31.
set /a zwerg=%ran% %% 6283185 
32.
if %zwerg% LSS 0 ( 
33.
	set /a zwerg=%zwerg% * -1 
34.
35.
 
36.
set zwerg=000000000%zwerg% 
37.
set erg=%zwerg:~-7,1%%trennzeichen%%zwerg:~-6,99% 
38.
goto :eof 
39.
 
40.
 
41.
:eof
Achtung! Das Skript braucht jetzt wesentlich länger! Ich kann die Verzögerung aber leider schlecht kontrollierbar kleiner machen. Aber das sollte ja kein Problem sein.

Gruß
Snow
Zitat von: Garuga
Edit: Ist es nicht einfacher meine Methode zur berehcnung zu nehmen?
Zufall = Random(0,20000)
Zahl = Zufall*PI/10000

damit hätte man bereits eine genauigkeit von 5 stellen und eine verteilung die exakt so ist wie die der random funktion oder?

Leider gibt es keine echte Random-funktion, ich kann bloß den Wert der %random%-Variable abgreiffen, welchen ich nicht beeinflussen kann.
Aber ein kurzer Blick über die Ergebnisse scheint zu bestätigen, dass die Werte gut verteilt sind.
Bitte warten ..
Mitglied: Garuga
01.06.2011 um 16:31 Uhr
Super danke, funktioniert und keine doppelten zahlen mehr wie es aussieht.

Danke vielmals, hast mir eine Menge Handarbeit gespart!

Mit freundlichen Grüßen
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...