Wie wird RND / RAND errechnet?

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

the FR3AK

Betreff: Wie wird RND / RAND errechnet?

BeitragDo, Jul 12, 2007 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Question

PowerProgrammer

BeitragDo, Jul 12, 2007 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 12, 2007 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink.
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? ^^
....

D2006

Administrator

BeitragDo, Jul 12, 2007 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragDo, Jul 12, 2007 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Laughing
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!

Xeres

Moderator

BeitragDo, Jul 12, 2007 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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)
bis = (ende+1) - start
a = 7^5
c = 1020
zahl = ((a * RndSeed() + c) Mod bis) + (start)
SeedRnd zahl
Return zahl
End Function
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.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

flohrian

BeitragDo, Jul 12, 2007 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 12, 2007 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 12, 2007 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Geeecko

BeitragFr, Jul 13, 2007 10:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jul 13, 2007 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jul 13, 2007 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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...

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group