 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jan

Anmeldungsdatum: 04.01.2005 Beiträge: 74
|
Verfasst am: 29.04.2005, 20:01 Titel: Zufallsgenerator |
|
|
Hi,
wie schonmal erwähnt, hab ich mal einen Zufallsgenerator programmiert.
Kurz zur Erläuterung:
Der Benutzer gibt eine Zahl ein, die als Maximum dient. Nun werden alle Zahlen zwischen 1 und der Benutzereingabe Maximum als Zufallszahlen in Betracht gezogen.
Das Programm speichert diese in zufälliger Reihenfolge (Zufallsgenerator halt ) in einem Feld.
Keine der Zahlen wiederholt sich hierbei, d.h. bei einem Bereich von 1 - 50 kommt die 37 nur einmal vor. Logisch.
Hab nun ein paar "Leistungstests" durchgeführt. Dazu habe ich die Datei mal kompiliert, wodurch die Leistung nochmal verbessert wurde. Hier die Ergebnisse:
Zahlenbereich = 1 - 100
Rechenzeit = 0.15 Sekunden
Zahlenbereich = 1 - 1000
Rechenzeit = 22 Sekunden
Zahlenbereich = 1 - 10.000
Rechenzeit = ~ 24 Minuten
( Alle Tests wurden auf einem P3 mit 500 Mhz durchgeführt. )
Nun zu meiner Frage.
sind diese Ergebnisse im Vergleich zu anderen Generatoren gleich gut, oder schneller? Wenn ja, dann, aber auch nur dann, würde ich gerne mal mein Programm bei qbasic.de zu DL anbieten. Daher benötige ich eure Hilfe! Ich möchte das eigentlich nur veröffentlichen, wenn das auch ein wenig mit den anderen mithalten kann
Wenn ihr das mal auf eurem System ausprobieren wollt, kann ich den Quellcode mal posten. |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 29.04.2005, 23:00 Titel: |
|
|
Hallo
Da gibt es ein Problem. Wenn jede Zahl nur einmal vorkommt, funktioniert das ja sicher irgendwie so, dass solange Zufallszahlen gezogen werden, bis jede mindestens einmal dran war. Dann ist es aber auch zum Teil vom Zufall abhängig, wie lange das Programm dazu braucht. Mache doch mal mehrere Durchläufe des selben Programms. Du solltest dabei eigentlich schwankende Laufzeiten bekommen.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Devilkevin aka Kerstin

Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
Verfasst am: 30.04.2005, 09:43 Titel: |
|
|
Aber wen man eine For/Next Schleife macht in der ein kleiner Timer eingebaut hat man schon sein eigenes kleines Benchmark Porgramm  _________________ www.piratenpartei.de |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 30.04.2005, 10:24 Titel: |
|
|
Hallo
Ich habe auch mal probiert, sowas zu schreiben. Allerdings braucht mein 1 GHz-Athlon unter Windows und im Interpreter damit keine 0,5 Sekunden für 32000 Zufallszahlen?
Code: | CLS
INPUT "Maximum: "; max%
DIM z%(max%)
RANDOMIZE TIMER
ta = TIMER
FOR a% = 1 TO max%
doppelt:
r% = FIX(RND * max%)
IF z%(r%) > 0 THEN GOTO doppelt
z%(r%) = a%
NEXT
tb = TIMER
t = tb - ta
PRINT t |
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 11.09.2005, 18:16 Titel: Pseudozufallszahlen |
|
|
Da wir grad soviel Spaß an alte-Threads-ausgraben haben, mache ich auch mal mit.
Ich habe auch mal ein Programm geschrieben, was Pseudozufallszahlen erstellt, die sich nicht wiederholen.
Pseudozufallszahlen sind natürlich alle Zufallszahlen vom Computer, aber meine haben doch ein System, was in jeden Durchlauf gleich ist, aber doch ausreichend durcheinander ist.
Ich poste es, da es ja vielleicht welche gibt, die nicht wiederholende Zufallszahlen brauchen, aber nicht soo viel Wert auf völligen Zufall legen. Und natürlich ist das Programm sehr schnell (etwa 1000mal schneller als das von Skilltronic).
Und da ich auch gerade dabei bin, wieso kann man bei seinem Programm eigentlich auch nicht in FB mehr als 32000 Zufallszahlen erzeugen?
So und hier noch mein Programm: http://fb.exp-soft.de/fbnp/?view=46
Bei Bedarf erleutere ich es auch noch etwas.
Zuletzt bearbeitet von Tomtitom am 12.09.2005, 12:51, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
tilli

Anmeldungsdatum: 10.09.2005 Beiträge: 73
|
Verfasst am: 11.09.2005, 19:06 Titel: |
|
|
Moin Ihr Spaßvögel
Wenn Ihr die eigentliche Routine nicht aufruft, kann das Prgramm natürlkich nicht schneler sein )
Hier mal meine Varianten zusätzlich:
Code: |
DECLARE SUB createrandom(n AS UINTEGER)
DECLARE FUNCTION nextrandom()
DECLARE FUNCTION bin2dec(binz AS STRING)
DIM SHARED rand$
createrandom(15)
dim a as integer
t# = TIMER
FOR i = 1 TO 32000
a= nextrandom
'PRINT nextrandom
NEXT
PRINT "Tomtitom-Variante";TIMER-t#
SLEEP
SUB createrandom(n AS UINTEGER) 'Erstellt String für Binärzahl für Dezimalzahl bis 2^n
FOR i = 1 TO n
rand$ = rand$ + "1"
NEXT
END SUB
FUNCTION nextrandom() 'in einer festen Reihenfolge (aber durcheinander) werden alle Zahlen bis 2^n erzeugt
rand$ = RIGHT$(rand$,LEN(rand$)-1) + STR$(VAL(MID$(rand$,1,1)) XOR VAL(MID$(rand$, 2,1)))
nextrandom = bin2dec(rand$)
END FUNCTION
FUNCTION bin2dec(binz AS STRING)
FOR i = 1 TO LEN(binz) 'Binärzahl verkehrtrum
zahl += 2^(i-1)*VAL(MID$(binz,i,1))
NEXT
bin2dec=zahl
END FUNCTION
DIM RD AS UINTEGER
RD=32767 '(set all bits)
t#= TIMER
FOR I=0 TO 32000
rd=(rd AND 16383) SHL 1 + (((rd AND 16384)shr 14) xor ((rd AND 8192)shr 13))
'? rd
NEXT I
PRINT " Freebasic Variante1"; TIMER-t#
SLEEP
t#= TIMER
FOR I=0 TO 32000
rd=(rd AND 16383) SHL 1 + 1 and ((rd AND 16384)=16384) xor ((rd AND 8192)=8192)
'? rd
NEXT I
PRINT " Freebasic Variante2"; TIMER-t#
SLEEP
t#= TIMER
FOR I=0 TO 32000
asm
mov ax,rd
push ax
and ax,16384
shr ax,14
pop bx
push bx
and bx,8192
shr bx,13
xor bx,ax
pop ax
and ax, 16383
add ax,bx
mov rd,ax
end asm
'? rd
NEXT I
PRINT " ASM Variante" ;TIMER-t#
SLEEP
|
Das sollte so funktionieren.
CU2
Tilli |
|
Nach oben |
|
 |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 11.09.2005, 19:13 Titel: |
|
|
tilli hat Folgendes geschrieben: | Moin Ihr Spaßvögel
Wenn Ihr die eigentliche Routine nicht aufruft, kann das Prgramm natürlkich nicht schneler sein )
|
hups, stimmt in FB gibt es ja jetzt auch direkt die Binären Funktionen, ich hänge noch etwas der QB-programmierweise nach
Aber das ist ja auch egal, es kam ja hauptsächlich auf den Algorithmus an, es ist natürlich klar, dass die internen Funktionen von FB schneller sind, als meine Ersatzfunktionen.
Hab auch nochmal die schnellste (verständliche) Routine von dir mit Parametern gemacht, damit man es an seine Bedürfnisse anpassen kann:
Code: | DIM rd AS UINTEGER
n= 4 'bis 2^n -1 Zahlen
rd=2^n-1 '(set all bits)
t#= TIMER
FOR I=0 TO 15
rd=(rd AND 2^(n-1)-1) SHL 1 + ((rd AND 2^(n-1))shr (n-1)) xor ((rd AND 2^(n-2)))shr (n-2)
? rd
NEXT I
PRINT TIMER-t#
sleep |
Edit: meinen Hochgeladenen Code habe ich so geändert, dass er sofort in QB funktioniert, denn da geht es ja nicht mit SHL und co. |
|
Nach oben |
|
 |
tilli

Anmeldungsdatum: 10.09.2005 Beiträge: 73
|
Verfasst am: 12.09.2005, 16:09 Titel: |
|
|
Moin
wenn jemand was mit speed sucht - und festen 15bit - dann kann er es mal so versuchen - ich habe dafür eine Tabellegenommen, in die ich alles reinschreibe - mir war so, des gleichen Zugriffs wegen - und zur Kontrolle ob es funktioniert.
der code sieht folgendermaßen aus:
Code: |
DIM SHARED randarray AS UShort PTR
DIM i AS INTEGER
randarray= ALLOCATE (LEN (UINTEGER) * 65526)
SUB cleararray
FOR i=0 TO 65525
randarray[i]=0
NEXT
END SUB
FUNCTION checkarray AS STRING
DIM ch$
DIM i1,i2
ch$="OK"
FOR i1=0 TO 32000
IF (i1 MOD 100)=110 THEN
LOCATE 20,20,1
?i1;" ";
END IF
FOR i2=i1+1 TO 32000
IF randarray[i1]=randarray[i2] THEN
ch$="fault-array ("+str$(i2)+")=("+str$(i1)+")="+str$(randarray[i2])+"|"
i2=32001
i1=i2
END IF
NEXT
NEXT
checkarray=ch$
'LOCATE 20,20,1
'?" "
'LOCATE l,1,1
'l+=5
END FUNCTION
SUB show
FOR i=0 TO 20
? randarray[i]
NEXT
END SUB
cleararray
rd=32767
t#= TIMER
ASM
mov ecx,32000
mov edx,randarray
mov ax,rd
start_schleife2:
mov bx,ax
push ax
SHR ax,14
AND ax,1
SHR bx,13
AND bx,1
xor bx,ax
pop ax
AND ax, 16383
SHL ax
add ax,bx
'mov rd,ax
inc edx
inc edx
mov [edx],ax
dec cx
jnz start_schleife2
END ASM
PRINT " ASM Variante2" ;TIMER-t#
PRINT checkarray
show
deallocate (randarray)
SLEEP
|
Der Unterschied beider Varianten zu deiner ursprünglichen ist die Reihenfolge der Bits - dadurch sind hier eventuell die Reihen einfacher zu erkenne - aber das sollte eigentlich nicht DAS große Problem sein. Man muss dann halt ein paar bits würfeln - wenn nötig.
Deine Routine ist sicherlich die flexiblere - und auch fix genug für den Alltag.
Ich habe nebenbei festgestellt, dass as SHR relativ langsam ist - die Vergleichsroutine war manchmal schneller.
hier mal ein Vergleich:
Zitat: |
Tomtitom-Variante 0.6512990495968118
OK
Freebasic Variante1 8.573727339644677e-004
OK
Freebasic Variante2 9.093347188784406e-004
OK
ASM Variante 3.015471261296199e-003
OK
ASM Variante2 1.330059169010411e-003
OK
---------oder ------------
Tomtitom-Variante 0.6532987478833832
OK
Freebasic Variante1 6.855629478845771e-004
OK
Freebasic Variante2 2.401146514271701e-003
OK
ASM Variante 7.283058708011936e-004
OK
ASM Variante2 7.065153638485811e-004
OK
|
Tomtitom ist die alte von Ihm,
Variante 1 ist die mit dem direkten Zugriff, Variante 2 ist mit dem Vergleichszugriff und die Assammblervarianten unterscheiden sich im Wesentlichen darin, dass die 2. ganz in Assambler geschrieben ist - es ist also durchaus feststellbar, das:
1. Die Betriebssystemunterbrechungen einen wesentlichen Einfluss auf das 'messrauschen' haben
2. der Basiccompier schon einen recht sauberen Code von sich gibt, de nicht wesentlich optimierbar ist.
zum Vergleich:
eine einfache Schleife hat schon eine Zeit von etwa 1.5e-004
CU2
Tilli
PS: Wer den Code für einen Vergleichstest haben will soll mir kurz schreiben(hoffentlich macht die Firewall das mit) - oder soll ich Ihn kurz irgendwo hier ablegen - sind 208 Zeilen gesamt... |
|
Nach oben |
|
 |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 12.09.2005, 20:42 Titel: |
|
|
Edit> hab mich etwas verlesen, also ist dieser Beitrag eigentlich hinfaellig
tilli hat Folgendes geschrieben: | PS: Wer den Code für einen Vergleichstest haben will soll mir kurz schreiben(hoffentlich macht die Firewall das mit) - oder soll ich Ihn kurz irgendwo hier ablegen - sind 208 Zeilen gesamt... |
Edi
Fuer genau sowas wurde http://fb.exp-soft.de/fbnp/ angelegt. |
|
Nach oben |
|
 |
tilli

Anmeldungsdatum: 10.09.2005 Beiträge: 73
|
Verfasst am: 14.09.2005, 15:27 Titel: |
|
|
Moin
Es hat funktioniert!
CU2
Tilli |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|