Batchdatei %random% begrenzen?
Ich möchte eine Random Zahl zwischen 0 und 60 erstellen lassen und weiss nicht wie kann mir wer weiterhelfen?
Dangeee
9 Antworten
aach, muss man da nicht dem counter sagen, er soll einmal eine zahl von 0 - 9 und noch einmal eine zahl ausgeben die 0 - 9 groß ist, aber wenn größer als 6 dann soll er die verwerfen.
dann wird so lange gewürfelt bis man zwei zahlen 0 - 6 und 0 - 9 bekommt und die beiden werden dann einfach als string addiert.
zack hab ich hinten eine zahl, vorne nicht größer als 6 und insgesamt muss ich den counter dann nicht auf 0 - 99 stellen und die knapp warscheinlichen 40 ungewünschten zahlen nicht alle komplett verwerfen. Müsste um einiges schneller gehen so an die wunsch zufallszahl zu kommen.
set zahl random 0 bis 9 + (set zahl random, if größer als 6, set neue zahl, if kleiner als 6 then) schreibe beide strings nebeneinander und betrachte als zahl im dezimalsystem.
aach, hnöö.. ich dacht ich helfe dir mehr, in dem ich dir sag wie man das machen könnte. Außerdem ist ja gar nicht klar in welcher sprache.
ich bin grad bewillt das in brainF**K zu schreiben um dich zu foppen, aber hnööh.. ich bin immer so faul nach der arbeit, ich bin noch gar nicht richtig zuhause angekommen grad.
heisst das dass ich selbst herausfinden muss wie ich das in meine Batchdatei packen will? :(
keine Ahnung xD hab gestern angefangen es soll einfach dann ein timeout machen solange wie diese zufallszahl ist.
Sechzig geht bei deiner Methode aber nicht und was passiert bei 6? Du arbeitest nur größer und kleiner ab. ohne else
gratuliere, hast recht.
Nur waren die *.bat ursprünglich keine Programmiersprache sondern nur die Möglichkeit Kommandlinebefehle in einer Textdatei zusammenzufassen. Wie es halt auch in anderen Umgebungen möglich ist. Ok es wurden die Möglichkeiten ausgeweitet.
Kurze Antwort:
set /a num = min + (max-min+1) * %random%/32768
In deinem Fall wäre dann max=60 und min=0. Entweder du setzt diese Variablen vorher, oder du schreibst es direkt konstant so:
set /a num = (60+1) * %random%/32768
Warum das funktioniert:
Für die Anpassung des Zahlenraums benötigen wir zunächst eine Zahl zwischen 0 und 1. Bei vielen Programmiersprachen bekommen wir direkt so eine geliefert, da Batch aber keine floats/doubles oder ähnliches unterstützt, bekommen wir hier nur einen Integer. Wenn wir diesen durch 32768 teilen, bekommen wir theoretisch eine Zahl zwischen 0 und 1 (die durch Batch aber, aus vorher genanntem Grund, nur als 0 dargestellt wird). Mit dieser können wir ganz gewöhnlich verfahren: Mit dem Unterschied zwischen max und min +1 (sodass max eingeschlossen ist) multiplizieren, sodass wir den richtigen Umfang haben. Diesen heben wir dann auf die gewünschte Wertemenge, indem wir das Minimum hinzuaddieren.
naja ...
und weil es immer auch einen anderen Weg gibt werfe ich meine Modulo-Methode auch noch in den Ring:
set /a "num=%random% %% 60 +1"
Diese Methode liefert lediglich den beim "Teilen" der Zufallszahl durch Max übrigen ganzzahligen Rest . Dieser liegt immer zwischen 0 und Max-1 .
In deinem Fall zwischen 0...59 . +1 macht daraus eine Zahl zwischen 1...60.
Was die Zufälligkeit der Methoden angeht, so haben Tim als auch ich lange Versuchsreihen gefahren
Zufälligkeit von Random in Batch ist nicht gerade überragend, genügt jedoch für die meisten Fälle.
Im folgenden ein kleiner Test, wie sich Tim's und meine Methode schlagen.
und wie es ausfällt, wen man beides mischt....
- Die Variable count legt die Anzahl der Würfe fest. (1 bis 2Milliarden)
- max_num die höchste Augenzahl. (0 bis 32768)
- min_num die niedrigste Augenzahl (0 bis 32767)
die Werte können angepasst werden.
@echo off
color 1e & cls
set /a "count=50000"
set /a "max_num=6"
set /a "min_num=1"
set /a "dummy=0"
set /a "double[1]=0"
set /a "double[2]=0"
set /a "double[3]=0"
setlocal enabledelayedexpansion
echo Die Berechnung von %count% Zufallszahlen kann etwas dauern...
timeout 1 >nul
echo. & echo 1. Runde
echo Division mit 32768. &echo.
for /L %%x in (%min_num%,1,%max_num%) do (
set /a "statistic1[%%x]=0"
)
for /L %%x in (1,1,%count%) do (
rem bei Klammern im Term immer quoten sonst verschluckt sich der Parser
set /a "num=(!random!*(%max_num%-%min_num%+1) /32768) +%min_num%"
set /a "statistic1[!num!]+=1"
<nul set /p =!num! || ver >nul
rem echo. !num!
if !num! equ !dummy! set /a "double[1]+=1"
set /a "dummy=!num!"
)
echo. & echo.
echo 2.Runde
echo Modulo mit max. &echo.
:2_nd
for /L %%x in (%min_num%,1,%max_num%) do (
set /a "statistic2[%%x]=0"
)
for /L %%x in (%min_num%,1,%count%) do (
set /a "num=!RANDOM! %% (%max_num%-%min_num%+1) +%min_num%"
set /a "statistic2[!num!]+=1"
set /p=!num!<nul || ver >nul
if !num! equ !dummy! set /a "double[2]+=1"
set /a "dummy=!num!"
)
echo. & echo.
:mix
echo Mix von beidem &echo.
for /L %%x in (%min_num%,1,%max_num%) do (
set /a "statistic3[%%x]=0"
)
for /L %%x in (1,2,%count%) do (
set /a "num=(!random!*(%max_num%-%min_num%+1) /32768) +%min_num%"
set /a "statistic3[!num!]+=1"
<nul set /p=!num! || ver >nul
if !num! equ !dummy! set /a "double[3]+=1"
set /a "dummy=!num!"
set /a "num=!RANDOM! %% (%max_num%-%min_num%+1) +%min_num%"
set /a "statistic3[!num!]+=1"
set /p=!num!<nul || ver >nul
if !num! equ !dummy! set /a "double[3]+=1"
set /a "dummy=!num!"
)
:Auswertung
echo. & echo.
for /L %%x in (%min_num%,1,%max_num%) do (
echo %%x wurde !statistic1[%%x]! mal in der 1. Runde gewuerfelt
echo %%x wurde !statistic2[%%x]! mal in der 2. Runde gewuerfelt
echo %%x wurde !statistic3[%%x]! mal in der Mix Runde gewuerfelt
echo.
)
echo In der Runde 1 gab es !double[1]! aufeinander folgende Wrfe mit gleicher Augenzahl
echo In der Runde 2 gab es !double[2]! aufeinander folgende Wrfe mit gleicher Augenzahl
echo In der Mix Runde gab es !double[3]! aufeinander folgende Wrfe mit gleicher Augenzahl
echo.
echo.
::set statistic
pause
echo off
title Number from 1 to 60.
cls
:loop
cls
set /a rand=%random% %%60
echo %rand%
pause >nul
goto loop
Ist das der Code den ich einfach eifügen kann in die Batch Datei?