- Offizieller Beitrag
Statt einfach nur ins Leere zu shiften, kann man die 32Bitzahl auch gleich als 4 Zufallszahlen (à 8 Bit) betrachten. Das würde dann so aussehen:
AutoIt
$iRandom = Random(0, 2^31-1, 1)
ConsoleWrite('Zufall = ' & Hex($iRandom) & @CR)
For $i = 0 To 3
ConsoleWrite($i+1 & '. = 0x' & Hex(BitAND($iRandom, 0xff), 2) & @CR)
$iRandom = BitShift($iRandom, 8)
ConsoleWrite('nach Shift = ' & Hex($iRandom) & @CR)
Next
Das ist in AutoIt aber langsamer (getestet), weil die Anzahl der Befehle innerhalb der Schleife zunimmt.
Testcode:
AutoIt
#include <WinAPILocale.au3>
Global $tNUMBERFMT = _WinAPI_CreateNumberFormatInfo(0, 0, 3, '', '.', 1) ; <- ist nur für die formatierte Ausgabe
Global $iCount = 10000000 ; Anzahl der Zufallszeichen
SRandom(@MSEC) ; Startwert für Random ändern
HotKeySet('{ESC}', '_Stop') ; zum Abbrechen des Programms
; ----- Variante 1 mit Chr(Random) -----
Global $sText = '', $iLoop = 0, $iDiff = 0
AdlibRegister('_Progress', 500)
_Progress()
Global $iTimer = TimerInit()
For $iLoop = 1 To $iCount
$sText &= Chr(Random(0, 255, 1))
Next
$iDiff = TimerDiff($iTimer)
AdlibUnRegister()
ToolTip('')
ConsoleWrite('Variante 1 = ' & Round($iDiff / 1000, 3) & ' sek. (' & _WinAPI_GetNumberFormat(0, StringLen($sText), $tNUMBERFMT) & ' Zeichen)' & @CRLF)
;~ MsgBox(0, 'Variante 1', Round($iDiff / 1000, 3) & ' sek.' & @CRLF & _WinAPI_GetNumberFormat(0, StringLen($sText), $tNUMBERFMT) & ' Zeichen')
; ----- Variante 1 mit Chr(Random) -----
; ----- Variante 2 mit $aChar[Random] -----
Global $sText = '', $iLoop = 0, $iDiff = 0
AdlibRegister('_Progress', 500)
_Progress()
Global $iTimer = TimerInit()
Global $aChar[256]
For $i = 0 To 255
$aChar[$i] = Chr($i)
Next
For $iLoop = 1 To $iCount
$sText &= $aChar[Random(0, 255, 1)]
Next
$iDiff = TimerDiff($iTimer)
AdlibUnRegister()
ToolTip('')
ConsoleWrite('Variante 2 = ' & Round($iDiff / 1000, 3) & ' sek. (' & _WinAPI_GetNumberFormat(0, StringLen($sText), $tNUMBERFMT) & ' Zeichen)' & @CRLF)
;~ MsgBox(0, 'Variante 2', Round($iDiff / 1000, 3) & ' sek.' & @CRLF & _WinAPI_GetNumberFormat(0, StringLen($sText), $tNUMBERFMT) & ' Zeichen')
; ----- Variante 2 mit $aChar[Random] -----
; ----- Variante 3 mit BitShift $aChar[Random] -----
Global $sText = '', $iLoop = 0, $iDiff = 0
AdlibRegister('_Progress', 500)
_Progress()
Global $iTimer = TimerInit()
Global $aChar[256], $iRandom
For $i = 0 To 255
$aChar[$i] = Chr($i)
Next
For $iLoop = 1 To $iCount Step 4
$iRandom = Random(0, 2^31-1, 1)
For $i = 0 To 3
$sText &= $aChar[BitAND($iRandom, 0xff)]
$iRandom = BitShift($iRandom, 8)
Next
Next
$iDiff = TimerDiff($iTimer)
AdlibUnRegister()
ToolTip('')
ConsoleWrite('Variante 3 = ' & Round($iDiff / 1000, 3) & ' sek. (' & _WinAPI_GetNumberFormat(0, StringLen($sText), $tNUMBERFMT) & ' Zeichen)' & @CRLF)
;~ MsgBox(0, 'Variante 2', Round($iDiff / 1000, 3) & ' sek.' & @CRLF & _WinAPI_GetNumberFormat(0, StringLen($sText), $tNUMBERFMT) & ' Zeichen')
; ----- Variante 3 mit BitShift $aChar[Random] -----
Func _Stop()
Exit
EndFunc ;==>_Stop
Func _Progress()
ToolTip(Int(100 / $iCount * $iLoop) & '%', Default, Default, 'Progress', 1, 1)
EndFunc ;==>_Progress
Alles anzeigen
Ergebnis: