[C++] random() liefert scheinbar immer die gleichen Werte !

hm, ich bekomme diese fehlermeldung:

Code:
/home/.../sortieren.cpp:35: error: `GetTickCount' undeclared (first use this function)
/home/.../sortieren.cpp:35: error: (Each undeclared identifier is reported only once for each function it appears in.)
 
Ähm... an den Pfaden sehe ich gerade, dass Du unter Linux bist. Da gibt es diese Funktion natürlich nicht. Unter Linux wüsste ich momentan keine zuverlässige Lösung.
 
Ich weiß zwar nicht, wieviele Werte Du benötigst, aber eventuell hilft dieser kleine Trick:
erzeuge Dir am Anfang zwei Zufallszahlen. Mit beiden führst Du dann ein Bitshift z. B. nach links durch, die ein Zahl um eine Stelle, die andere um drei Stellen. Wichtig ist dabei, dass die rausgeschobenen Stellen hinten wieder reinkommen, die Zahl also durchrotiert.
Vor jeder Erzeugung einer neuen Zufallszahl verknüpftst Du die beiden XOR, das Ergebnis danach mit dem Wert den time() liefert.
Das ganze ist hinreichend zufällig, es lässt sich auch mit mehreren weiteren Zahlen betreiben.
Auf nem DSP hat es wunderbar geklappt, das Rauschen am Ausgang war perfekt.

Gruß
Morgoth
 
@Morgoth
ich kapier leider nichts..

Code:
srand(time(NULL));
for (int x = 0; x<1000; x++) { 
	Array[x] = rand()%(1001);
}
hab das jetzt so.
wenn ich das prog 2 mal in der sekunde aufrufe, dann hab ich die gleichen werte.
aber in sich sind sie verschieden.

ich glaub, dass was morgoth vorgeschlagen hat, ist was anderes, kann mich aber irren..

mittlerweile hab ich was gefunden:
http://www.opengroup.org/onlinepubs/009695399/functions/gettimeofday.html

kann mir da vielleicht jemand die parameter erklaeren, was ich da eingeben muss (oder ein beispiel geben)?


ps:
sry, wenn es dumme fragen sind.
ich bin neu auf diesem gebiet..
 
Hi, warum so umständlich?

probiert mal das:

#include<stdlib.h>
#include<math.h>
#include<time.h>

#define MIN_Zahl 10
#define MAX_Zahl 100
int Zufalllszahl;
.
.
.
//Generator Initialisieren( vor schleifen,selektionen, etc.)
randomize();
.
.
.
//Zufallszahl generieren
Zufallszahl=max(MIN_Zahl,random(MAX_Zahl));
.
.
.​

Damit bekommt man eine Zufallszahl >=MIN_Zahl und <= MAX_Zahl.
 
jcdenton2 schrieb:
Hi, warum so umständlich?

probiert mal das:
.....

Deine Lösung hat zwei gravierende Schwachstellen. Erstens funktioniert sie nicht richtig, wenn das Minimum eine negative Zahl ist. Zweitens, ist das Minimum größer als 0, erhältst Du (unter Annahme einer statistischen Gleichverteilung der Zufallswerte) mit einer Wahrscheinlichkeit von Minimum/Maximum immer das Minimum. Das sind Eigenschaften, die einer brauchbaren Zufallszahl nicht genügen.

Code:
#include <ctime>
#include <cstdlib>
#include <math.h>

int zufallswert( int minimum, int maximum)
{
  const int range = maxmimum - minimum;
  return random( range) + minimum;
}

int main( void)
{
...
...
  srand( time( 0)); ///< Zufallsgenerator EINMAL initialisieren
..
..
  int wert = zufallswert( 10, 100);
}
 
Hallo,

auch unter Linux sollte es doch eine äquivalente Funktion geben, die die Systemzeit in Ticks liefert? Wenn man in der Hilfe nichts findet, einfach mal in den Systemheaderdateien nach tick oder count oder clock greppen.

Habe leider keinen Linuxrechner da.

MfG

Arnd
 
Naja, das Problem dabei ist ja, dass sie nach Möglichkeit POSIX.1 oder zumindest C89 kompatibel sein sollte. Ohne dem kann es ja schon schwierig werden, dass Programm auf einem anderen Linux zum Laufen zu kriegen, geschweige denn 'richtige' UNIXe.
 
Dann wird es schwierig. Solche Sachen sind meistens Systemabhängig :-).

MfG

Arnd
 
derTiroler schrieb:
@Morgoth
ich kapier leider nichts..

OK, mal Schritt für Schritt. Der Einfachheit halber beschränke ich das mal auf 4-Bit.

1.) Zwei Zahlen erzeugen, z. B. 1001 u. 1011
------hier sollte die Schleife beginnen------
2.) Beide Zahlen XOR-Verknüpfen: 0010
3.) Dieses Ergebnis XOR mit der aktuellen Zeit verknüpfen
4.) Dieses Ergebnis in srand() verwenden
5.) Bitshift nach links: Zahl 1 um eine Stelle, Zahl 2 um drei Stellen; die vorne rausgeworfenen Ziffern müssen hinten wieder reingesteckt werden: Zahl 1: 0011 Zahl 2: 1101
-----hier beginnt die Schleife wieder von vorne--------

In diesem Beispiel durchlaufen die beiden Zahlen also die folgenden Zustände:
Zahl 1 Zahl 2 XOR
1001 1011 0010
0011 1101 1110
0110 1110 1000
1100 0111 1011
1001 1011 0010

Mehr geht mit 4-Bit nicht, schon nach 4 Bitshifts kommt wieder das gleiche raus, weil Zahl 1 um 4 Stellen, Zahl 2 um 4*3=12 Stellen, also ein ganzzahliges Vielfaches von 4, verschoben wurde. Bei 32-Bittern ist das natürlich nicht so häufig, man kann auch errechnen, wann das Ergebnis optimal ist. Man kann auch mit den Verschiebungsverhältnissen experimentieren, hier wäre vielleicht eines von 3:2 hilfreich. Ich hab es mit 3:1 gemacht, und es war hinreichend zufällig.

Gruß
Morgoth
 
Zurück
Oben