Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Zufallsgenerator

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jan



Anmeldungsdatum: 04.01.2005
Beiträge: 74

BeitragVerfasst am: 29.04.2005, 20:01    Titel: Zufallsgenerator Antworten mit Zitat

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 grinsen ) 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? mit den Augen rollen 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 zwinkern

Wenn ihr das mal auf eurem System ausprobieren wollt, kann ich den Quellcode mal posten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 29.04.2005, 23:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Devilkevin
aka Kerstin


Anmeldungsdatum: 11.11.2004
Beiträge: 2532
Wohnort: nähe Mannheim

BeitragVerfasst am: 30.04.2005, 09:43    Titel: Antworten mit Zitat

Aber wen man eine For/Next Schleife macht in der ein kleiner Timer eingebaut hat man schon sein eigenes kleines Benchmark Porgramm lächeln
_________________
www.piratenpartei.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 30.04.2005, 10:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Tomtitom



Anmeldungsdatum: 20.09.2004
Beiträge: 308

BeitragVerfasst am: 11.09.2005, 18:16    Titel: Pseudozufallszahlen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
tilli



Anmeldungsdatum: 10.09.2005
Beiträge: 73

BeitragVerfasst am: 11.09.2005, 19:06    Titel: Antworten mit Zitat

Moin Ihr Spaßvögel lächeln

Wenn Ihr die eigentliche Routine nicht aufruft, kann das Prgramm natürlkich nicht schneler sein lächeln)

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Tomtitom



Anmeldungsdatum: 20.09.2004
Beiträge: 308

BeitragVerfasst am: 11.09.2005, 19:13    Titel: Antworten mit Zitat

tilli hat Folgendes geschrieben:
Moin Ihr Spaßvögel lächeln

Wenn Ihr die eigentliche Routine nicht aufruft, kann das Prgramm natürlkich nicht schneler sein lächeln)


hups, stimmt in FB gibt es ja jetzt auch direkt die Binären Funktionen, ich hänge noch etwas der QB-programmierweise nach verlegen

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
Benutzer-Profile anzeigen Private Nachricht senden
tilli



Anmeldungsdatum: 10.09.2005
Beiträge: 73

BeitragVerfasst am: 12.09.2005, 16:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Tomtitom



Anmeldungsdatum: 20.09.2004
Beiträge: 308

BeitragVerfasst am: 12.09.2005, 20:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
tilli



Anmeldungsdatum: 10.09.2005
Beiträge: 73

BeitragVerfasst am: 14.09.2005, 15:27    Titel: Antworten mit Zitat

Moin

Daumen rauf! Es hat funktioniert! Pfff....

CU2
Tilli
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz