Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 13.06.2013, 13:52 Titel: Zufallszahlen ohne Dubletten? |
|
|
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 |
|
 |
Domso
Anmeldungsdatum: 02.02.2011 Beiträge: 109
|
Verfasst am: 13.06.2013, 14:43 Titel: |
|
|
setze mal das randomize an den anfang... dann geht das bedeutend schneller! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 13.06.2013, 15:05 Titel: |
|
|
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. )
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 13.06.2013, 19:29 Titel: |
|
|
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 |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 14.06.2013, 02:22 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 14.06.2013, 07:15 Titel: |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 14.06.2013, 11:26 Titel: |
|
|
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 |
|
 |
|