immernoch keine immer unterschiedlichen Zufallszahlen ausspucken. Bei
häufigem Aufrufen von rand() scheint es sich auch aufzuhängen. Ich weiß,
dass auch nach srand immer nur etwa jede Sekunde eine "neue" Zahl
möglich ist. Im Debugger läuft deshalb auch alles problemlos, denn da
sind ja die Zeitabstände wesentlich größer und das Programm hängt sich
auch nicht auf.
Aber wie macht man denn nun eine "echte" Zufallszahl, auch wenn es das
beim Computer nicht gibt?
Mark M. schrieb:> Bei> häufigem Aufrufen von rand() scheint es sich auch aufzuhängen. Ich weiß,> dass auch nach srand immer nur etwa jede Sekunde eine "neue" Zahl> möglich ist. Im Debugger läuft deshalb auch alles problemlos, denn da> sind ja die Zeitabstände wesentlich größer und das Programm hängt sich> auch nicht auf.
Bei meinem selbstgeproggten Spielen verwende ich immer rand() und es
hängt sich nie auf. Es wird auch z.T mehrere hundert mal in der Sekunde
aufgerufen. Da wird wohl eher ein Fehler in deinem Programm sein.
Mark M. schrieb:> mit> int zahl=rand();> immernoch keine immer unterschiedlichen Zufallszahlen ausspucken.
[...]
> Bei häufigem Aufrufen von rand() scheint es sich auch aufzuhängen.
Das rand() deiner C-Bilbiothek scheint ziemlich kaputt zu sein, oder
dein Programm enthält einen Fehler.
> Ich weiß, dass auch nach srand immer nur etwa jede Sekunde eine "neue"> Zahl möglich ist.
Wie kommst du denn darauf?
> Im Debugger läuft deshalb auch alles problemlos, denn da sind ja die> Zeitabstände wesentlich größer und das Programm hängt sich auch nicht> auf.
Es gibt jede Menge möglicher Gründe, warum sich das Programm im Debugger
nicht aufhängt. Die Zeitabstände zwischen Aufrufen von rand() gehören da
aber eher nicht dazu.
> Aber wie macht man denn nun eine "echte" Zufallszahl, auch wenn es das> beim Computer nicht gibt?
Erstmal solltest du rausfinden, warum rand() bei dir nicht funktioniert.
Wozu brauchst du denn eine echte Zufallszahl? Es gibt manche Computer,
die einen Hardware-Zufallszahlengenerator eingebaut haben, der den Wert
z.B. über das termische Rauschen eines Transistors ermittelt.
Mark M. schrieb:> Ich weiß,> dass auch nach srand immer nur etwa jede Sekunde eine "neue" Zahl> möglich ist.
Wer hat dir das erzählt?
Hat der auch vom Weihnachtsmann gesprochen und von komischen Stimmen?
Aus deiner Aussage "immer unterschiedliche Zahlen" entnehme ich, das du
vielleicht eine Liste mir Liedern abspielen willst und sich kein Lied
wiederholen soll oder sowas ähnliches. Also erstmal ist es bei
zufälligen Zahlen auf keinen Fall so, dass sie sich nciht wiederholen.
Das die Zahlen gleichverteilt sind, gilt nur für unendlich viele Aufrufe
der Funktion. Und da es Pseudozufallszahlen stimmt auch das mit der
Gleichverteilung nur bedingt.
Wenn du wirklich eine Playliste oder sowas in der Art machen willst,
dann schreibe die die Titel bzw. die Zahlen von z.B. 1 bis 100 in eine
Liste. Dann sortierst du die Liste um, indem du zufällig zwei Elemente
tauschst. Also so in der Art:
for (i = 0; i < 100; i++)
{
int idx1 = rand() % 100;
int idx2 = rand() % 100;
int sp = liste[idx1];
liste[idx1] = liste[idx2];
liste[idx2] = sp;
}
Hier ein sehr vielversprechendes Verfahren für die Bestimmung von
Zufallszahlen, allerdings ist etwas Hardware erforderlich ...
http://www.lavarnd.org/
Wie benutzt Du die beiden Funktionen?
Wichtig ist daßß man den Pseudozufalsszahlengenerator EIN mal
initialisiert
z.B. mit
time_t t;
time(&t);
srand((unsigned int)t);
danach kann man die Funktion so oft benutzen wie man will!
Wichtig: Mit dem selben Startwert bekommt amn immer die identische
Zufallszahlenfolge, es ist halt ein Pseudozufallsgenerator, aber die
Folge an sich ist relativ gut verteilt!
Deshalb muss man den Generator auch bei jedem Start durch eine neue Zahl
(z.B Zeit) neu initialisieren.
Wenn mich meine eingerosteten C kenntnisse nicht täuschen sollte man
beim Aufruf von time korrekterweise nicht time(0); sondern time(NULL);
benutzen, um kenntlich zu machen, daß ein Zeiger übergeben wird (bzw
halt der NULL Pointer)
Ausserdem sollte das entsprechende include nicht fehlen.
Ich glaube für die Zufallszahlen ist das stdlib.h.
Udo Schmitt schrieb:> Wenn mich meine eingerosteten C kenntnisse nicht täuschen sollte man> beim Aufruf von time korrekterweise nicht time(0); sondern time(NULL);> benutzen, um kenntlich zu machen, daß ein Zeiger übergeben wird (bzw> halt der NULL Pointer)
Psst.
NULL ist nichts anderes als eine Verpackung für 0
Und zwar für den Integer 0!
Und keinesfalls für einen void Pointer
(Übrigens sehr zu meinem Leidwesen)
Rolf Magnus schrieb:> Erstmal solltest du rausfinden, warum rand() bei dir nicht funktioniert.
Jede Wette es funktioniert perfekt.
Nur hat ihm keiner erzählt, dass man srand() nur EINMAL aufruft und dann
lässt man den Generator in Ruhe seinen Job machen: bei jedem Aufruf von
rand() eine Zahl zu liefern.
Frank schrieb:> Ein schöner Algorithmus, um eine Zufallszahl zu erzeugen:
Wo hast du ihn her?
> habe. Kannst Du ja entsprechend anpassen. Der Algorithmus erzeugt> zumindest "bessere" Zufallszahlen als rand().
Kommt immer drauf an, was man unter besser versteht.
Zufallszahlen sind statistisch gar nicht so leicht zu fassen. Aussagen
über die Qualität eines Generators kann man aber nur auf statistischer
Basis erhalten.
>Mach' Dich zunächst im>Internet über diesen Algorithmus schlau.
Warum sollte ich das tun?
Du gibst keine Referenz an, bezeichnest ihn als "zumindest "bessere"
Zufallszahlen als rand()". Wobei ich kaum glaube, das jede (C) rand()
Implementierung identisch ist.
Generierung von Zufallszahlen ist eine komplizierte Wissenschaft, soviel
weiß ich immerhin, und das genügt mir derzeit.
Es kommt immer darauf an, zu was man die Zufallszahl braucht - für ein
Spiel reicht eine einfache SW Generierung sicher aus. Aber wenn es um
Krypto und Security geht, dann sieht die Sache wieder ganz anders aus,
da kriegt man ganz schnell seine so wunderbar ausgeklügelte,
selbstgebastelte Lösung ganz schnell um die Ohren gehauen...
(Nicht umsonst hat ST seiner neuen F2x Controller Reihe nun einen in
Hardware gegossenen analogen Zufallszahlengenerator spendiert.)
Karl heinz Buchegger schrieb:> Psst.> NULL ist nichts anderes als eine Verpackung für 0> Und zwar für den Integer 0!> Und keinesfalls für einen void Pointer
Wie gesagt, die Kenntnisse sind etwas angerostet. Trotzdem weisst einem
das NULL darauf hin daß es ein Pointer sein soll und kein int.
K&R sagt dazu: "Die symbolische Konstante NULL wird benutzt um
hervorzuheben, daß dies ein spezieller Wert für einen Zeiger ist".
Obwohl, soweit ich mich erinnere NULL nicht immer als ((void *)0)
definiert ist, sondern auch manchmal einfach als 0.
Karl heinz Buchegger schrieb:> Jede Wette es funktioniert perfekt.> Nur hat ihm keiner erzählt, dass man srand() nur EINMAL aufruft und dann> lässt man den Generator in Ruhe seinen Job machen:
Doch, hatte ich 2 Postings vorher schon gemacht :-)
Schöne Weihnachten
Udo
Frank schrieb:> @ Karl heinz Buchegger>> http://en.wikipedia.org/wiki/Random_number_generation
Danke für die Links.
Aber ich weiß schon was es mit Zufallszahlen auf sich hat und auch wo
die Probleme liegen.
> Es wurde aber gezeigt, dass die Zahlen zufälliger sind, als mittels> rand() erzeugt.
Aha.
Da der C-Standard einem Entwickler nicht vorschreibt, welchen Generator
er zu benutzen hat, ... woher weißt du, dass in der Runtime-Lib des
Fragestellers nicht gerade dieses Verfahren benutzt wird?
Aber es stimmt schon.
Frühere rand() Implementierungen waren meistens nicht besonders gut.
Daher wurde oft von der üblichen Methode
a = rand() % Maximum
abgeraten, weil man wusste, dass die 'kleinen' Bits kein gutes
statistisches Zufallsverhalten zeigten.
Für den Hausgebrauch gut genug. Für Ca*sinos allerdings zu schwach.
Allerdings sind einige Aussagen des Fragestellers dergestalt, dass die
methodischen Probleme von rand() eher nicht zu seinen Problemen zählen
dürften.
@ Karl heinz Buchegger
Da gebe ich Dir freundlicherweise einen Link über die
Multiply-with-carry Methode des Mathematikers George Marsaglia. Und
Deine Antwort ist: Aber ich weiß schon was es mit Zufallszahlen auf sich
hat und auch wo
die Probleme liegen. (???)
Da gebe ich Hilfestellung und poste einen Algorithmus, der allgemein
unter Softwerkern, die sich mit Zufallszahlen beschäftigen, bekannt sein
sollte. Und ich soll mich auch noch dafür rechtfertigen?
Frank schrieb:> @ Karl heinz Buchegger>> Da gebe ich Dir freundlicherweise einen Link über die> Multiply-with-carry Methode des Mathematikers George Marsaglia. Und> Deine Antwort ist: Aber ich weiß schon was es mit Zufallszahlen auf sich> hat und auch wo> die Probleme liegen. (???)>> Da gebe ich Hilfestellung und poste einen Algorithmus, der allgemein> unter Softwerkern, die sich mit Zufallszahlen beschäftigen, bekannt sein> sollte. Und ich soll mich auch noch dafür rechtfertigen?#
Nein, du sollst dich nicht dafür rechtfertigen.
Du sollst überlegen, inwiefern dein Generator das Problem des
Fargestellers lösen kann.
Seni Problem ist sicher nicht die mangelnde Qualität von rand() (über
die man debattieren kann). Sein Problem ist, dass er rand() offenbar
nicht richtig benutzen kann!
Udo Schmitt schrieb:> Obwohl, soweit ich mich erinnere NULL nicht immer als ((void *)0)> definiert ist, sondern auch manchmal einfach als 0.
Geh mal in VC++ bei NULL auf Gehe zu Definition
Mark M. schrieb:> Aber wie macht man denn nun eine "echte" Zufallszahl, auch wenn es das> beim Computer nicht gibt?
Die üblichen Software-Implementierungen erzeugen deterministische
Zahlenfolgen, was für mancherlei Anwendungen ausreicht, aber für
kryptographische Verfahren allenfalls, wenn der Startwert gut zufällig
ist (die beliebte Uhrzeit ist es nicht).
Echt wird es, indem physikalische Vorgänge zufälligen Charakters
gemessen werden, wie Rauschen. Trivial ist das aber nicht unbedingt,
denn man sollte schon sicher sein, dass man es wirklich mit zufälligem
Rauschen zu tun hat und nicht mit irgendwelchen Störsignalen.
Dem annähern kann man sich, indem man diverse nicht miteinander
korrelierte Faktoren zusammenführt, wie irgendwelche Daten und
Wartezeiten aus Device Drivern und interaktiven Aktionen. In Linux
findet man das in /dev/random.
> Aber wie macht man denn nun eine "echte" Zufallszahl, auch wenn es das> beim Computer nicht gibt?
TrueCrypt erzeugt den Schlüssel (aus Zufallszahlen) unter Anderem mit
Hilfe der Benutzereingaben. Der Benutzer muss möglichst lange seine Maus
bewegen und verändert mit jedem Bewegungsschritt den Schlüssel. Je
nachdem, was der Benutzer mit der Maus macht, ist das ziemlich
'zufällig'.
Rolf Magnus schrieb:>> Ich weiß, dass auch nach srand immer nur etwa jede Sekunde eine "neue">> Zahl möglich ist.>> Wie kommst du denn darauf?
Hier Beitrag "zufallszahl mit rand() erzeugen" steht:
Rolf Magnus schrieb:>>Das Problem ist, dass bei jedem Aufruf der Funktion der gleiche>> zufallswert erzeugt wird und ich benötige unterschiedliche Werte>> Vermutlich nicht bei jedem Aufruf, sondern immer genau eine Sekunde lang> bzw bis time() einen neuen Wert liefert.
Das ist auch mein Problem. Wenn ich die Funktion in ner while-Schleife
mehrmals durchlaufen lasse, kommt mehrmals direkt hintereinander das
gleiche. Wenn ich dazwischen andere Aktionen packe, dann nicht.
Ich hab zum Bespiel die Eingabe einer beliebigen Taste dazwischen
gemacht, das läuft auch, hängt sich aber eben nach dem 4., 5. mal auf.
Wie Karl heinz Buchegger schon gestern (22.12.2010 15:52) schrieb:
srand NUR einmal am Anfang vom Programm aufrufen.
rand() ermittelt den neuen Wert aus dem letzten Zufallswert.
Wenn du mit srand() jedes mal den Startwert für rand() neu setzt kann
das nichts werden.
Dann musst du den Rückgabewert von fopen auch prüfen ob es geklappt hat.
Ein Aufruf von fopen in der Funktion sollte auch reichen.
Einer der besten Pseudozufallsgeneratoren heisst "Mersenne-Twister MT
19937":
http://de.wikipedia.org/wiki/Mersenne-Twister
Sourcecode befindet sich im Wikipedia Artikel.
Allerdings ist natürlich auch hier ein gescheiter Startwert nötig.
DirkB schrieb:> srand NUR einmal am Anfang vom Programm aufrufen.
Wenn ich das mache, hängt er sich auf.
DirkB schrieb:> Ein Aufruf von fopen in der Funktion sollte auch reichen.
Sicher? In
1
longintcntcharacter(FILE*datei,longintakt_pos);
wird die Datei aber auch gelesen. Kann ich den Stream dann wie ein
Zeiger übergeben?
nummer=rand()%(zeilenzahl/7);// nummer==zahl zwischen 0 und anzahl_vokabeln-1
9
}while(vorigeChk(nummer)==1);
10
11
intzeilennummer=nummer*7+1;// zeilennummer, ab der die Vokabel steht
Wenn du eien Sequenz von Zahlen in einem bestimmten Bereich benötigst,
von denen garantiert keine doppelt vorkommt und die bunt durcheinander
gewürfelt sind, dann macht man das so:
Man erzeugt sich ein Array mit den Zahlen von 0 bis zur Obergrenze
for( i = 0; i < ANZAHL; ++i )
arr[i] = i;
und dann würfelt man die durcheinander, indem man zufällig immer 2
Elemente vertauscht
for( i = 0; i < ANZAHL; ++i ) {
randInd = rand() % ANZAHL;
tmp = arr[i];
arr[i] = arr[randInd];
arr[randInd] = tmp;
}
und erhält dann ein Array mit der gewünschten Länge, in der die Zahlen
von 0 bis ANZAHL-1 in einer zufälligen Reihenfolge angeordnet sind.
Man braucht dann nur noch 1 Element nach dem nächsten sich dort abholen
und kann das dann zb zur Auswahl der nächsten Vokabel benutzen.
Mark M. schrieb:> DirkB schrieb:>> srand NUR einmal am Anfang vom Programm aufrufen.>> Wenn ich das mache, hängt er sich auf.
Wo genau?
Wahrscheinlich hier
1
do
2
{
3
nummer=rand()%(zeilenzahl/7);// nummer==zahl zwischen 0 und anzahl_vokabeln-1
4
}while(vorigeChk(nummer)==1);
wenn du prüfst ob diese Zahl schon vorgekommen ist.
Zeig doch mal den Mechanismus der da dahinter steckt oder schmeiss ihn
gleich über Board. Wenn du die Sache mit dem srand korrigiert hast,
brauchst du ihn nicht mehr (ist ja nicht schlimm, wenn ab und zu
dieselbe Vokabel 2 mal hintereinander abgefragt wird. Das wird nicht
sehr oft vorkommen, sobald du srand() richtig einsetzt)
Mark M. schrieb:> DirkB schrieb:>> srand NUR einmal am Anfang vom Programm aufrufen.>> Wenn ich das mache, hängt er sich auf.>> DirkB schrieb:>> Ein Aufruf von fopen in der Funktion sollte auch reichen.>> Sicher? In>
1
longintcntcharacter(FILE*datei,longintakt_pos);
wird die
> Datei aber auch gelesen. Kann ich den Stream dann wie ein Zeiger> übergeben?
Du liest mir ehrlich gesagt etwas zuviel von den Dateien ein.
Gibt es einen Grund, warum du den Vokabelvorrat nicht einfach im
Speicher halten willst?
Wenn eine Vokabel dazukommt, wird sofort alles auf die Datei gesichert,
aber ansonsten wird alles im Speicher abgewickelt.
default:fehler("beim Einlesen von Datei in struct!");
25
}
26
fclose(stream);
27
lesen++;
28
akt_pos=akt_pos+cntch+1;// 1 für den Zeilenumbruch
29
}
das alles ist hauptsächlich eines:
maximale Beschäftigungstherapie für Rechner und Festplatte.
aber ansonsten ziemlich sinnlos und maximal kompliziert
1
FILE*stream;
2
stream=fopen(datei,"r");
3
fseek(stream,0,SEEK_SET);// an den Anfang springen
wenn du eine Datei zum Lesen öffnest, steht der Filepointer sowieso am
Anfang. Da musst du nicht extra hinseeken
1
longintcntln=0;// zählt die Zeilen
2
charzeichen=fgetc(stream);
3
while(zeichen!=EOF)
4
{
5
if(zeichen=='\n')cntln++;
6
if(cntln==zeilennummer)break;// zufälliges Wort gefunden, Zeiger steht vor diesem
7
zeichen=fgetc(stream);
8
}// am Ende steht der Zeiger vor dem gesuchten Wort
kann man so machen. Aber wozu? fgets liest perfekt eine Zeile. Wenn du
bis zur i-ten Zeile nach vorne willst, dann lies einfach i Zeilen
mittels fgets ein
jetzt steht der FilePointer am Anfang der gewünschten Zeile, und da
jetzt einfach 7 Zeilen lesen
1
fgets(neu.wort,sizeof(neu.wort),stream);
2
fgets(neu.bed_1,sizeof(neu.bed1),stream);
3
fgets(neu.bed_2,sizeof(neu.bed2),stream);
4
fgets(neu.bed_3,sizeof(neu.bed3),stream);
5
fgets(neu.bed_4,sizeof(neu.bed4),stream);
6
fgets(neu.bed_5,sizeof(neu.bed5),stream);
Fertig. (Die gelesenen \n am Stringende müsste man eventuell noch
entfernen)
Dir scheint auch nicht klar zu sein, welche Bedeutung der 2. Parameter
von fgets hat.
Das ist nicht die Anzahl der Zeichen, die du zu lesen gedenkst, sondern
die Größe des Buffers, den du fgets zum Lesen übergibst! Du musst daher
nicht vorher feststellen, wie lang eine Zeile überhaupt ist. Das wäre
ziemlich sinnlos, wenn dich fgets dazu zwingen würde. fgets liest von
sich aus bis zum Zeilenende. Aber: wie bei allen Funktionen, die einen
String in einen Buffer schreiben, wäre es tunlichst angeraten, wenn
nicht zuviele Zeichen in diesen Buffer geschrieben werden und diesen
überlaufen. Daher muss fgets wissen, wie gross der Buffer ist. Das ist
dann auch gleichzeitig die maximale Anzahl an Zeichen, die fgets
gefahrlos lesen darf.
1
fclose(stream);
Das passt wieder.
Den Rückgabewert von fopen musst du noch testen!
Und so sieht das dann in Summe aus:
Karl heinz Buchegger schrieb:> Wo genau?> Wahrscheinlich hier do> {> nummer=rand()%(zeilenzahl/7); anzahl_vokabeln-1> } while(vorigeChk(nummer)==1);>> wenn du prüfst ob diese Zahl schon vorgekommen ist.
Zumal eine solche Funktion potenziell eine unendliche Laufzeit hat im
Worstcase ;)
Karl heinz Buchegger schrieb:> PS:> Wieso eigentlich 7?> Eine Vokabelbeschreibung besteht bei dir aus 6 Zeilen!
Weil ich zwischen jeder Vokabel eine Leerzeile habe, damit es
übersichtlich bleibt, wenn man die Datei von Hand erweitert.
Karl heinz Buchegger schrieb:> Was hast du hier eigentlich vor?> struct vokabel vokabel_aus_datei(char datei[])> {> int zeilenzahl=zeilen(datei); // zeilenzahl/7==anzahl vokabeln> srand(time(0));> int nummer=0;> do> {> nummer=rand()%(zeilenzahl/7); // nummer==zahl zwischen 0 und
anzahl_vokabeln-1
> } while(vorigeChk(nummer)==1);>> int zeilennummer=nummer*7+1; // zeilennummer, ab der die Vokabel steht
Der Check ist wahrscheinlich etwas umständlich impplementiert.
zeilennummer soll aber danach genau die Zahl haben, ab der das
fremdsprachige Wort steht, und das muss eine durch 7 teilbare Zahl sein
(mit einem "Offset" von 1, weil am Anfang der Datei auch eine Leerzeile
steht).
Mark M. schrieb:> Der Check ist wahrscheinlich etwas umständlich impplementiert.
Wie gesagt: Lass ihn weg
Sobald du srand richtig einsetzt ist er nur eine Fehlerquelle
zusätzlich.
Klaus Wachtler schrieb:> Wenn ich praktischerweise in meine /usr/include/linux/stddef.h> reinschaue
Und wen kümmert, was du in deiner Implementierung siehst?
"#define NULL (1-1)" wäre in C übrigens ebenso möglich und korrekt.
Oder "#define NULL (1/2)"
Frank Morster schrieb:> "#define NULL (1-1)" wäre in C übrigens ebenso möglich und korrekt.>> Oder "#define NULL (1/2)"
Trägt das jetzt irgendwie zu (void*) oder int bei?
Kümmert das jemanden?
Rolf Magnus schrieb:> ... die Sprachdefinitionen ...
Schön, daß es nur je eine gibt für C und C++ :-)
Ich denke, da liegt einfach der Hund begraben.
Alleine für C gibt es soviele Varianten, daß man jahrelang sinnlos
streiten kann, wie es denn in C definiert sei, solange sich niemand
äußert, auf welche Version er sich denn nun beziehen mag.
C als solches gibt es nicht, wenn man Korinthenkackerei betreiben will.
Abgesehen davon, daß es wichtigeres gibt, ob man 0 als 0 schreibt,
oder 1-1.
Frohe Weihnachten, egal ob mit void* oder int - jeder wie er will!
Klaus Wachtler schrieb:> Rolf Magnus schrieb:>> ... die Sprachdefinitionen ...>> Schön, daß es nur je eine gibt für C und C++ :-)
Es gibt tatsächlich nur je eine.
> Ich denke, da liegt einfach der Hund begraben.> Alleine für C gibt es soviele Varianten, daß man jahrelang sinnlos> streiten, wie es denn in C definiert, solange sich niemand äußert,> auf welche Version er sich denn nun beziehen mag.
Es gibt halt verschiedene Compiler, die sich mehr oder weniger gut an
die Spezifikation halten. Und es gibt natürlich alten Code, der noch aus
der Zeit davor stammt.
> C als solches gibt es nicht, wenn man Korinthenkackerei betreiben will.
Doch. Es ist definiert in ISO/IEC 9899:1999, wo ich auch den zitierten
Satz her habe.
> Abgesehen davon, daß es wichtigeres gibt, ob man 0 als 0 schreibt,> oder 1-1.
Das sicherlich. Ob NULL nun 0 oder (void*)0 ist, spielt in der Praxis an
sich auch keine Rolle. Bei manchen Compilern mag letzteres von Vorteil
sein, weil man dann eine Warnung bekommt, wenn man es versehentlich im
Kontext von Integern verwendet.
> Frohe Weihnachten, egal ob mit void* oder int - jeder wie er will!
Ebenso.
Rolf Magnus schrieb:>> C als solches gibt es nicht, wenn man Korinthenkackerei betreiben will.>> Doch. Es ist definiert in ISO/IEC 9899:1999, wo ich auch den zitierten> Satz her habe.
ok, ich meinte etwa "einen Standard, an den sich auch alle halten und
der damit für alle Programmierer verbindlich ist".
Das ist C99 nun leider nicht.
Klaus Wachtler schrieb:> Trägt das jetzt irgendwie zu (void*) oder int bei?
Ja. Es ist ein direkter Widerspruch zu deiner falschen Behauptung.
> Kümmert das jemanden?
Mich. Und jeden, der sich für die Sprache C interessiert und das Makro
NULL sowie Nullpointer verstehen will.
Aber pfusche du ruhig auf Basis von "ich hab da mal mal gesehen"
weiter...
Um nochmal kurz zurück zum Thema zu kommen:
Karl heinz Buchegger schrieb:> Wenn du eien Sequenz von Zahlen in einem bestimmten Bereich benötigst,> von denen garantiert keine doppelt vorkommt und die bunt durcheinander> gewürfelt sind, dann macht man das so:>> Man erzeugt sich ein Array mit den Zahlen von 0 bis zur Obergrenze>> for( i = 0; i < ANZAHL; ++i )> arr[i] = i;>> und dann würfelt man die durcheinander, indem man zufällig immer 2> Elemente vertauscht
Hat jemand eine Idee, wie man das ohne ein solches Array hinbekommen
kann?
Bevor die offensichtliche Gegenfrage kommt: In meinem Fall wäre dieses
Array 32 GB groß, und soviel RAM habe ich nicht.
> Hat jemand eine Idee, wie man das ohne ein> solches Array hinbekommen kann?
Mit einem genügend grossen LFSR? Kommt aber wohl darauf an, was du sonst
noch für Ansprüche an die generierte Sequenz hast.
Bartli schrieb:>> Hat jemand eine Idee, wie man das ohne ein>> solches Array hinbekommen kann?>> Mit einem genügend grossen LFSR? Kommt aber wohl darauf an, was du sonst> noch für Ansprüche an die generierte Sequenz hast.
Ich habe einen Wertebereich von 0 bis n (n variabel, grob im Bereich
einige Millionen bis mehrere Milliarden - 32 Bit reichen notfalls, 64
wären aber besser) und hätte nun gerne eine C-Funktion, die mir alle
Werte aus diesem Bereich in pseudozufälliger Reihenfolge ausspuckt,
jeden genanu einmal. Die Qualität des Zufallsgenerators muß nicht sehr
hoch sein.
Wie wäre es mit einer Funktion, die mit einem Wert im Bereich
aufgerufen wird und immer nach demselben Algo die Bits verwürfelt?
Diese Funktion kann man dann mit fortlaufenden Werten aufrufe, oder
auch mit jedem mittendrin.