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:

Zufallszahlen ohne Dubletten?

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



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 13.06.2013, 13:52    Titel: Zufallszahlen ohne Dubletten? Antworten mit Zitat

Code:
FOR ziehung = 1 TO 49
 DO
 RANDOMIZE TIMER
 zahl(ziehung) = INT(RND * 49) + 1
 test = 0
 FOR alte = 1 TO ziehung - 1
 IF zahl(ziehung) = zahl(alte) THEN test = 1
 NEXT
 LOOP WHILE test = 1
 PRINT zahl(ziehung)
 NEXT
 SLEEP
 END


Ich habe obigen Code gefunden. Wenn ich den laufen lasse, braucht der ewig bis die 49 Zahlen gefunden sind. Gibt es eine Möglichkeit, dass die Zahlen schneller gefunden werden? Ich brauche eine einfache Möglichkeit, Zahlen ohne Wiederholung zu finden. Es hilft mir ja nichts, wenn für das finden von 49 Zahlen, 1 Minute oder gar 2 Minuten vergehen.

Bei 49 Zahlen sind es zwar keine 2 Minuten, nicht mal 1 Minute, aber bei 100 oder gar 200 Zahlen deutlich zu lang!

Ich glaube ich habe fast keine andere Wahl oder? Ich werde mir da selber mal was basteln müssen.

Mit schachlichen Grüßen
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Domso



Anmeldungsdatum: 02.02.2011
Beiträge: 109

BeitragVerfasst am: 13.06.2013, 14:43    Titel: Antworten mit Zitat

setze mal das randomize an den anfang... dann geht das bedeutend schneller!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 13.06.2013, 15:05    Titel: Antworten mit Zitat

Zumal ein RANDOMIZE TIMER nur jede Sekunde einmal auf einen neuen Startwert stellt. RANDOMIZE wird in so gut wie allen Fällen genau einmal benötigt, nämlich am Programmbeginn.
(Ich hatte erst ein Projekt, in dem ich zwei RANDOMIZE im Programm benötige. happy )

Zum Durchmischen von gegebenen Zahlen empfehle ich den Thread http://forum.qbasic.at/viewtopic.php?t=4588
(falls du mein Programm nutzen willst, dann bitte das untere richtige und nicht das obere falsche ...)
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 13.06.2013, 19:29    Titel: Antworten mit Zitat

richtig,
RANDOMIZE an den Anfang und die Kontrollschleife abbrechen wenn ein Zahlendoppel erkannt wird.
Mein Netbook ist nicht das schnellste, es braucht nur 0.000142 Sekunden dafür.
Code:
Randomize Timer
Dim As Double t = Timer
For ziehung = 1 To 49
  Do
    zahl(ziehung) = Int(Rnd * 49) + 1
    test = 0
    For alte = 1 To ziehung - 1
      If zahl(ziehung) = zahl(alte) Then
        test = 1
        Exit For
      EndIf
    Next
  Loop While test = 1
  'Print ziehung,zahl(ziehung)
Next
Print Timer-t
Sleep
'in 0.000142 Sekunden

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 14.06.2013, 02:22    Titel: Antworten mit Zitat

Danke für die Antworten!
Mal schauen was sich machen lässt.
Der Quellcode von Volta funktioniert bestens! Braucht aber auf meinem Rechner etwas länger als auf dem Rechner von Volta? Nur Minimal länger.
Fällt aber kaum ins Gewicht, bei der Geschwindigkeit!

Ist ein Randomize Timer in der Sub in Ordnung, oder sollte ich das wirklich nur einmal am Programmanfang reinschreiben?

Mit schachlichen Grüßen
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 14.06.2013, 07:15    Titel: Antworten mit Zitat

Schreibe es wirklich an den Programmanfang. Wenn du es in die SUB schreibst, wird es mehrmals (nämlich bei jedem Aufruf der SUB) aufgerufen. Das ist nicht nur unnötig und zeitaufwendig*, es kann (in der Kombination RANDOMIZE TIMER) sogar genau das Gegenteil von dem bewirken, was du willst - nämlich dass mehrmals dieselbe Zufallsfolge erzeugt wird.

*) Wir reden hier von Millisekunden; aber trotzdem.

(Eine SUB ist ja in der Regel dazu da, mehrmals aufgerufen zu werden - solltest du eine reine Initialisierungs-SUB planen, die nur einmal am Programmanfang aufgerufen wird, dann sieht das anders aus; dann könnte das RANDOMIZE auch in die SUB.)
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 14.06.2013, 11:26    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Ist ein Randomize Timer in der Sub in Ordnung, oder sollte ich das wirklich nur einmal am Programmanfang reinschreiben?


Der Pseudo-Zufallszahlen-Generator ist so konstruiert, dass er einmal initialisiert wird (zu Beginn des Programms bzw. einmalig vor dem ersten Bezug von Zufallszahlen) und dann eine beliebig lange Zufallsfolge liefert. Ein guter Algorithmus (siehe z. B. MT) schafft es dabei, dass die Ergebnisse mit der Zeit (siehe hier) ungefähr gleichverteilt sind.

Wie nemored schon sagt: Wenn du ihn immer wieder neu von vorne initialisierst, verminderst du vermutlich sogar die Güte der Zufallszahlen.
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. 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