Wie wird RND / RAND errechnet?
Übersicht

![]() |
the FR3AKBetreff: Wie wird RND / RAND errechnet? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich frage mich wie Blitz die Zahlen für die Funktion RND und RAND errechnet...
sind da i-wie Zahlentabellen eingespeichert oder wird da die Uhrzeit miteinberechnet oder ist es eine ewiglange Formel die kein Mensch kapiert ![]() |
||
![]() |
PowerProgrammer |
![]() Antworten mit Zitat ![]() |
---|---|---|
http://de.wikipedia.org/wiki/Pseudozufall
http://de.wikipedia.org/wiki/Zufallsgenerator Und hier hast du auch nochmal nen Zufallsgenerator: http://www.math.sci.hiroshima-...T/emt.html Wie Blitz das intern genau macht, weiß ich leider nicht. Ich hoffe, das hilft dir trotzdem. |
||
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter! |
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es gibt nen zähler im pc, der zählt alles (sekunden etc.)
wie viel seit 1990 vergangen sind. Und daraus rechnet der dann irgendeinen schrott ![]() Deswegen gibt es bei hardware (Gut... Pc is auch hardware, aber z.b. GameBoy oder so) kein rand. Gut, das muss man sich aber selber schreiben. Weil wenn man nen hardware teil neustartet, fängt der zähler auch neu an zu zählen. also kommt immer das selbe raus. Verstehste? ^^ |
||
.... |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Meister_Dieb:
Sechs, setzen. Es gibt keinen solchen Zähler. Es gibt eine Datenstruktur, den sogenannten UNIX-Timestamp der die Sekunden seit 1.1.1970 speichert. Aber das ist nur eine Variable, die erst zur Verfügung gestellt werden muss. Einzig und allein die Uhrzeit aktualisiert der PC mit, auch wenn er aus ist. Aber: Wie du sicher weißt, ist Rnd und Rand unabhängig von der Uhrzeit. Erst wenn wir - wie es korrekterweise immer empfohlen wird - ql:SeedRnd ql:MilliSecs aufrufen, machen wir Zufallszahlen von der Zeit (aber nicht die Uhrzeit) abhängig. |
||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
![]() |
PowerProgrammer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Genau, da könnte zwar den Unix-Timestamp nutzen für SeedRnd, aber dies bietet Windows nicht an. Man benötigt etwas, was immer anders ist, da bietet sich MilliSecs() an, dass die vergangene Zeit in Millisekunden ermittelt, die Windows schon in Betrieb ist. Das war ein totaler Reinfall, Meister_Dieb ![]() Und dann hast du den Unix-Timestamp noch voll falsch erklärt, hammer. Es sind alles halt komplizierte Algos, die NICHTS (bis auf den Startwert) mit der Zeit zu tun haben. Es gibt viele Algos, siehe meine zuvor geposteten Links. |
||
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter! |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
C++ rechnet meines wissens mit der Formel
x+1 = (a * x) + c d.h. Das Ergebnis der Rechnung wird immer in die Rechnung wieder eingesetzt. Hab mal versucht, eine Eigene zufallsfunktion zu schreiben: Code: [AUSKLAPPEN] Function randomite(start=0,ende=1)
Das Problem dabei ist, das die Zahlen 1. Exakt immer in der Selben Reihenfolge kommen 2. Damit auch exakt gleich verteilt sind und 3. Bei größeren Mengen an Zufallszahlen wenige Zahlen viele Treffer haben, andere dagegen immer null.
bis = (ende+1) - start a = 7^5 c = 1020 zahl = ((a * RndSeed() + c) Mod bis) + (start) SeedRnd zahl Return zahl End Function |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
flohrian |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was auch lustig ist ist das hier:
[code]x=a*x*(1-x)[code] a ist ein konstanter Wert zwischen 0 und 4, ab (ich meine) 3,92 oder so gibt das dann sog. "chaotische Muster" die sich glaube ich sogar nicht wirklich wiederholen. x ist zuerst ein Startwert zwischen 0 und 1, die weiteren x-Werte werden dann eben im nächsten Schritt errechnet. Würde jetzt auch ein kleines Progrämmchen schreiben, dass das ganze in einer Schleife macht und dann als Graph zeichnet, hab nur jetzt keine Zeit. Einfach mal ausprobieren. Mfg Flo |
||
![]() |
PowerProgrammer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Xeres hat Folgendes geschrieben: C++ rechnet meines wissens mit der Formel
Da muss ich schon wieder schmunzeln. Aber darum gehts ja nicht... Das sind dann Zufallsfunktionen im einfachsten Stil, hier nochmal der Code von dem Teil, dass PHP (u.A.) auch nutzt: http://www.math.sci.hiroshima-...t19937ar.c Irgendwie habe ich aber das Gefühl, dass die Engine von BlitzBasic nicht sehr gut ist. Irgendwie ist dieser Pseudozufall zu unzufällig, aber es kann ja auch Zufall sein, dass meine Zufallszahlen immer so unzufällig sind^^ |
||
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter! |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jo vermutlich vergisst du seedrnd am Anfang, dann gibts immer die gleichen zufälligen zahlen.
Denn Blitz nutzt net direkt den Systemzeitgeber und andere dynamische quellen, dafür musst du den Seed ändern ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das selbe Problem hatte ich mal bei Hardware. Nur zur kleinen Info:
Lcd_puts schreibt was auf den LCD Display und analog(1) liefert den wert, wiedas (?) Potentiometer eingestellt ist. Hier mal die funktion: (Das der Zufall später richtig funtzt Code: [AUSKLAPPEN] lcd_puts("Einstellen..."); int w=0; for(w=0;w<4;w++) { lcd_gotoxy(0,1); char zu[2]; itoa(w,zu,10); lcd_puts(zu); lcd_puts("/3"); int zufall = (rand()%20+(w/rand()%w^(w*(analog(1)-10)/(analog(1)+5)^w))); srand(zufall); delay_ms(zufall); } [/quote] |
||
.... |
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hab ich mal vor langer, langer Zeit in C++ geschrieben:
Code: [AUSKLAPPEN] struct Random { static const int MAX_RAND = 0x7fff; Random() : seed_( 0 ) {} Random( int seed ) : seed_( seed ) {} int GetNumber() const { return seed_ = 69069 * seed_ + 1, ( seed_ & MAX_RAND ); } int GetNumber( int max ) const { return ( max == 0 ) ? 0 : GetNumber() % max; } int GetNumber( int min, int max ) const { return ( ( min | max ) == 0 || min > max ) ? 0 : min + GetNumber( max-min+1 ); } private: mutable int seed_; }; |
||
http://bl4ckd0g.funpic.de |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich hatte mal das problem das ich zufallszahlen immer gleich haben wollte. auf einem pc ganz einfach: seedrnd 0 aber blitz maacht da irgendwie vom pc abhängig es kamen nämlich bei manchen pc andere werte raus.... da hab ich mir CRand geschrieben....
Code: [AUSKLAPPEN] Global Function_CRand_choose=1,Function_CRand_seed=1
Function CRand(from,to_) If Function_CRand_choose=0 Function_CRand_choose=1 If Function_CRand_seed=0 Function_CRand_seed=1 area=to_-from seed=Function_CRand_seed seed=Sqr(seed)+(Sin(Function_CRand_choose^7)+1)*area num=seed old=num Mod area New_= old +from Function_CRand_choose=Function_CRand_choose+1 Return New_ End Function Function SeedCRand(seed) Function_CRand_seed=seed Function_CRand_choose=1 End Function das hat sich genau wie rand benutzen lassen und bringt überall die gleichen sinnlosen werte raus... |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group