Batchdatei %random% begrenzen?

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. 
Luegu 
Fragesteller
 06.04.2019, 23:32

Ist das der Code den ich einfach eifügen kann in die Batch Datei?

0
xxfistexx  06.04.2019, 23:34
@Luegu

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.

0
Luegu 
Fragesteller
 06.04.2019, 23:36
@xxfistexx

heisst das dass ich selbst herausfinden muss wie ich das in meine Batchdatei packen will? :(

0
xxfistexx  06.04.2019, 23:38
@Luegu

was soll es denn werden? MS Dos, oder powershell'?

0
Luegu 
Fragesteller
 06.04.2019, 23:39
@xxfistexx

keine Ahnung xD hab gestern angefangen es soll einfach dann ein timeout machen solange wie diese zufallszahl ist.

0
kuku27  07.04.2019, 08:34

Sechzig geht bei deiner Methode aber nicht und was passiert bei 6? Du arbeitest nur größer und kleiner ab. ohne else

0
timlg07  07.04.2019, 10:05

Ein umständlicherer Weg ist dir nicht eingefallen?

2
HugeGameArtGD  07.04.2019, 10:09

Natürlich kann man in der Batch deutsch schreiben.

1

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 Wrfe  mit gleicher Augenzahl
echo In der Runde 2 gab es !double[2]! aufeinander folgende Wrfe  mit gleicher Augenzahl
echo In der Mix Runde gab es !double[3]! aufeinander folgende Wrfe  mit gleicher Augenzahl
echo.
echo.
::set statistic
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

echo off

title Number from 1 to 60.

cls

:loop

cls

set /a rand=%random% %%60

echo %rand%

pause >nul

goto loop

Luegu 
Fragesteller
 06.04.2019, 23:40

Dangeee das ist was ich brauchte :D

0