Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
oldzorro
Anmeldungsdatum: 09.03.2018 Beiträge: 20 Wohnort: Erkelenz
|
Verfasst am: 20.03.2018, 13:25 Titel: Problem:Zufallszahlen in einem array |
|
|
habe mit dem Code:
Code: | '5 Zufallzhlen in ein array speichern
Dim i as Integer
Dim a(1to 5)As integer
For i=1 To 5
a(i)=Int(Rnd*9)
Next
For i=1 To 5
Print a(i) 'Die 5 Zufallszahlen ausgeben
Next
Sleep |
Zufallszahlen In ein array erzeugt.
Das Programm zeigt keine Fehler ,aber es werden bei jedem Aufruf immer
die gleichen Zahlen erzeugt.Ich glaube,daß es an der Eigenschaft von normalen arrays liegt.
Kann man mit rel. einfachen Einfügungen erreichen,daß bei jedem Aufruf neue Zufallszahlen in die arrays geschrieben werden?
Oder geht das garnicht mit statischen arras?
Danke im voraus |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 20.03.2018, 14:15 Titel: |
|
|
Das hat nichts mit dem Array zu tun, sondern daran, dass der Zufallsgenerator-Seed bei jedem Programmstart derselbe ist. Mit dem Schlüselwort RANDOMIZE lässt sich das ändern. Üblicherweise wird dazu beim Programmstart die Anweisung "RANDOMIZE TIMER" (Korrektur: Nur RANDOMIZE ist besser, siehe unten) verwendet, um die aktuelle Systemlaufzeit als Zufallsquelle zu nutzen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Zuletzt bearbeitet von Jojo am 20.03.2018, 15:35, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 20.03.2018, 15:02 Titel: |
|
|
In FreeBASIC ist es sogar besser, RANDOMIZE ohne Initialwert zu verwenden. Dann wird der Initialwert ebenfalls auf Basis des TIMER berechnet, allerdings ist RANDOMIZE TIMER nur sekundengenau (warum auch immer), RANDOMIZE allein hat eine höhere zeitliche Auflösung.
Code: | '5 Zufallzhlen in ein array speichern
Randomize
Dim i as Integer
Dim a(1to 5)As integer
For i=1 To 5
a(i)=Int(Rnd*9)
Next
For i=1 To 5
Print a(i) 'Die 5 Zufallszahlen ausgeben
Next
Sleep |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
oldzorro
Anmeldungsdatum: 09.03.2018 Beiträge: 20 Wohnort: Erkelenz
|
Verfasst am: 20.03.2018, 17:18 Titel: |
|
|
Danke Euch,.Randomize hatte ich wohl vergessen,in anderen Progrämmchen mit rnd atte ich es.In diesem code habe ich erstmals ein array benutzt und habe die Ursache im array gesehen.
Aloso: vor rnd immer den Generator mit randomize anschmeißen!!!!! |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 20.03.2018, 22:39 Titel: |
|
|
Von mir früher noch gerne gemacht: Zum Testen/Bugs beseitigen eines Codes zunächst das RANDOMIZE weggelassen (auskommentiert), damit man immer denselben Testfall hatte.
Sobald alles passt, dann RANDOMIZE hineinnehmen fürs produktiv erzeugte .EXE der Anwendung. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 20.03.2018, 23:29 Titel: |
|
|
oldzorro hat Folgendes geschrieben: | Danke Euch,.Randomize hatte ich wohl vergessen,in anderen Progrämmchen mit rnd atte ich es.In diesem code habe ich erstmals ein array benutzt und habe die Ursache im array gesehen.
Aloso: vor rnd immer den Generator mit randomize anschmeißen!!!!! | Es reicht, wenn man RANDOMIZE oder RANDOMIZE TIMER ganz am Anfang vom Programm 1x aufruft! So mache ich es immer. Bei mir ist das nicht direkt vorm RND. Wenn man mit einer DO LOOP Schleife arbeitet oder arbeiten würde, würde man somit mehrmals das RANDOMIZE aufrufen.
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 24.03.2018, 13:35 Titel: |
|
|
ALWIM hat Folgendes geschrieben: | oldzorro hat Folgendes geschrieben: | Danke Euch,.Randomize hatte ich wohl vergessen,in anderen Progrämmchen mit rnd atte ich es.In diesem code habe ich erstmals ein array benutzt und habe die Ursache im array gesehen.
Aloso: vor rnd immer den Generator mit randomize anschmeißen!!!!! | Es reicht, wenn man RANDOMIZE oder RANDOMIZE TIMER ganz am Anfang vom Programm 1x aufruft! So mache ich es immer. Bei mir ist das nicht direkt vorm RND. Wenn man mit einer DO LOOP Schleife arbeitet oder arbeiten würde, würde man somit mehrmals das RANDOMIZE aufrufen. |
Ich möchte nochmal hervorheben, wie ALWIM schon sagte, RANDOMIZE keinesfalls vor jedem RND Aufruf auszuführen, sondern am Besten einmalig beim Programmstart. Weiters bitte auch den Tipp von nemored beachten und RANDOMIZE ohne Parameter aufrufen, da der Parameter intern immer auf einen Ganzzahl gerundet wird, was zu einer weniger zufälligen Initialisierung führt. Einen Parameter für RANDOMIZE zu verwenden macht nur Sinn, wenn du reproduzierbare Ergebnisse haben willst (wofür dann allerdings TIMER unbrauchbar wäre). _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
|