Die Sache mit dem Zufall
-
Hi!
Ich habe einen Chatbot geschrieben, der auf kommando einen von 15 Witzen erzählen soll. Das Ganze soll natürlich per zufall passieren.
Im moment mache ich es so:int iZufall; LoadWitze(&WitzData); iZufall = GetTickCount()%WitzeZaehlen(&WitzData);Die Funktion WitzeZaehlen öffnet eine Datei, wo die Witze abgespeichert sind und zählt die Anzahl der Witze, die da gespeichert sind. Diese Anzahl nehme ich für den Modulo um das Maximum für die Zufallszahl zu bestimmen.
Vom Prinzip klappt es auch, nur leider gibt es Witze, die häufiger erzählt werden als andere. Manche kommen so gut wie nie drann.
Gibt es noch eine Möglichkeit das Ganze etwas "zufälliger" zu machen? Ich dachte da an eine art Mathematische Streufunktion, aber vielleicht gibt es auch was besseres!? Notfalls muss ich halt nachschauen welcher Witz schon erzählt wurde und den dann aus der Liste streichen, bis alle durcherzählt wurden. ^^
-
srand() / rand()?
-
rand() ist blöd, die gibt immer den selben Wert zurück.

-
bitte bisschen mehr nachdenken bevor du antwortest. guck dir erstmal srand an
-
es kommt drauf an wie du das mit rand(), srand() umsetzt..
wenn du das mit der aktuellen Zeit initialisierst kommen wirklich zufällige Werte raus, und nicht immer die gleichen!#include <ctime> //... srand((unsigned int) time(NULL));Gruss
joe
-
einarmjoe schrieb:
wenn du das mit der aktuellen Zeit initialisierst kommen wirklich zufällige Werte raus, und nicht immer die gleichen!
Falsch! Wirklich zufällige Werte kannst du in keinem PC dieser Welt erzeugen.
-
Reyx schrieb:
Falsch! Wirklich zufällige Werte kannst du in keinem PC dieser Welt erzeugen.
hmm...gleich der erste Beitrag von mir falsch .. fängt ja gut an ..

Ich möchte aber doch klarstellen das mir das klar war und damit gemeint habe.. man bekommt nicht immer die gleichen Werte raus, was der Fall ist wenn man srand mit einer festen Grösse initialisiert!Somit denke ich ist das für sein Chatprogramm schon der richtige Ansatz ist..
.. oder lieg ich da "wirklich" so falsch?Gruss
Joe
-
An deinem Beitrag hab ich gar nichts auszusetzen, nur eben
einarmjoe schrieb:
wenn du das mit der aktuellen Zeit initialisierst kommen wirklich zufällige Werte raus

@Perner
Wenn du rand() nicht verwenden willst, dann schau dir mal random_shuffle() an, das hat mir in einer ähnlichen Situation schonmal gute Dienste geleistet (erfordert aber den vorherigen Aufruf von randomize()).
-
Reyx schrieb:
einarmjoe schrieb:
wenn du das mit der aktuellen Zeit initialisierst kommen wirklich zufällige Werte raus, und nicht immer die gleichen!
Falsch! Wirklich zufällige Werte kannst du in keinem PC dieser Welt erzeugen.
Warum muß darauf gleich eine pauschal ebenfalls wohl eher falsche, mindestens aber unbeweisbare Antwort kommen, wo doch eigentlich klar war, was er meinte.

Tatsächlich gibt es sehr wohl div. Hardwarelösungen, zum Teil als Steckkarte, zum Teil als externe Lösung, die auf Basis verschiedenster Ansätze Nonalgo-Zufallszahlen erzeugen, z.B. wahlweise über Zerfallsprozesse/Strahlung, oder Halbleiterrauschen. Ein damit ausgestatteter PC erzeugt Zufallszahlen die den dafür existierenden Definitionen genügen. Wenn Du natürlich Einsteins Meinung bist, das Gott nicht würfelt und Heisenberg Unsinn erzählt hat, es also gar keinen Zufall gibt, ist das nur eine dünne Theorie und ein theologischer, denn naturwissenschaftlicher Ansatz und hat hier in jedem Fall vielleicht nur wenig mit dem Thema zu tun.

-
Ich habe mich auf Computer bezogen, nicht auf irgend welche externen Verfalls- oder Strahlentechniken! Und selbst in deinem Beispiel erzeugt der Computer keine Zufallszahlen, er "bekommt" sie lediglich!
Vom Aufbau deiner Argumentation kann man auch einen Menschen in den Computer stecken und behaupten, der Computer könne jetzt interaktiv auf den, der vorm Monitor sitzt, reagieren. Kann er aber nicht, auch wenn er vielleicht etwas "nutzt", was dies kann!

-
Reyx schrieb:
Ich habe mich auf Computer bezogen, nicht auf irgend welche externen Verfalls- oder Strahlentechniken! Und selbst in deinem Beispiel erzeugt der Computer keine Zufallszahlen, er "bekommt" sie lediglich!
Vom Aufbau deiner Argumentation kann man auch einen Menschen in den Computer stecken und behaupten, der Computer könne jetzt interaktiv auf den, der vorm Monitor sitzt, reagieren. Kann er aber nicht, auch wenn er vielleicht etwas "nutzt", was dies kann!
Dann hättest Du Deine Definition von PC noch dazuschreiben sollen. Für mich kann ein PC mit einer eingebauten Karte die Funktionen die das Paket erlaubt. Nach Deiner Definition kann man mit keinem PC TV-Programme empfangen, die meisten würden aber eher glauben das ein PC mit TV-Karte eben genau dieses tut. Mir scheint was Du eigentlich sagen wolltest ist, das heutige CPUs keine echten Zufallszahlen erzeugen können. Da stimme ich natürlich zu. Aber jetzt so zu tun das ein PC nur eine fest definierte Hardware mit von Dir bestimmten Karten ist, ist "merkürdig".

-
PCDefinitionError schrieb:
Mir scheint was Du eigentlich sagen wolltest ist, das heutige CPUs keine echten Zufallszahlen erzeugen können
Genau das meinte ich

Trotzdem ist es für mich ein Unterschied, ob da eine Karte im PC drin steckt oder irgenwelche Verfallsprozesse digitalisiert werden...
-
Mensch jungs, es ist nur ein einfaches Chatprogramm. Ich benötige keinen Höchstwissenschaftlichen zufall. Alles was ich will ist, das nicht immer der selbe witz erzählt wird.

Außerdem gibt es keinen Zufall. Zufall ist für mich eine für den Menschen unberechenbare begebenheit, ansonsten ist alles vorrausbestimmt. Theoretisch könnte man genau ausrechnen um wie viel Uhr ich auf die Sekunde morgen früh in mein Brötchen beißen werde, allerdings bräuchte ich dazu eine riesen formel in der sämtliche Naturbegebenheiten berücksichtigt sind (z.B. Butterfly effekt) aber ich weiche vom Thema ab.

Wie war das mit dem Shuffle? In Delphi gibts n gutes random, das muss man auch mit Randomize initalisieren. Wie geht das in c++?
-
#include <cstdlib> #include <iostream> #include <ctime> using namespace std; int main(int argc, char *argv[]) { srand((unsigned int)time(NULL)); for(int i=0;i<20;i++) { cout << rand() % 10 << endl; } system("PAUSE"); return EXIT_SUCCESS; }
-
Hier nochmal ein Code, der dir (fast) beweist, dass die Zahlen gleich häufig vorkommen:
#include <cstdlib> #include <iostream> #include <ctime> using namespace std; int main(int argc, char *argv[]) { int Anzahl[10]; memset(Anzahl,0,sizeof(Anzahl)); srand((unsigned int)time(NULL)); for(int i=0;i<1000;i++) { int x = rand() % 10; Anzahl[x]++; } for(int i=0;i<10;i++) { cout << int(Anzahl[i] / 10.0f) << " % der Zahlen waren " << i << endl; } system("PAUSE"); return EXIT_SUCCESS; }
-
das testet nicht mal ein Drittel der Bits deiner ZZ. und 1000 ? icht dacht das gild immer für n=infinity

-
b7f7 schrieb:
das testet nicht mal ein Drittel der Bits deiner ZZ. und 1000 ?
Warum nicht?
b7f7 schrieb:
icht dacht das gild immer für n=infinity

Was meinst du damit?
mfg.
-
joomoo schrieb:
b7f7 schrieb:
das testet nicht mal ein Drittel der Bits deiner ZZ. und 1000 ?
Warum nicht?
b7f7 schrieb:
icht dacht das gild immer für n=infinity

Was meinst du damit?
mfg.
wieviel bits einer 15bit zufallszahl benutzt man bei %10?
http://de.wikipedia.org/wiki/Gesetz_großer_Zahlen