[C++]Zufallszahlen : Problem

Guillermo

Mitglied
Hallo Leute,

ich habe ein kleines Problem, und zwar generiere ich durch einen Code Zufallszahlen, aber komischerweiße sind das immer die gleichen, und das will ich natürlich nicht, kann mir jemand weiterhelfen?

Ich habe diese Funktion hier, und die wird in main() dann 3 mal hintereinander aufgerufen, habe sie als test mal hier ausgeben lassen, damit ich sehe welche es sind, und es sind immer die gleichen Paare...

Code:
void zufallskoordinaten(void) {
     srand(time(NULL));
     int xKoordinate=rand()%5+1;
     int yKoordinate=rand()%5+1;
     cout << xKoordinate << yKoordinate << " ";
}
 
C:
#include <iostream>

void zufallskoordinaten() {
    srand(rand()*rand());
     int xKoordinate=rand()%5+1;
     int yKoordinate=rand()%5+1;

     std::cout << "X :" << xKoordinate << " Y :" << yKoordinate << "\n";
}


int main() {

    for(int i = 0; i < 50; i++) zufallskoordinaten();
    getchar();
    EXIT_SUCCESS;
    return 0;
    }

Funktioniert doch eigentlich schon gut. Was möchtest du denn am Ende damit machen? Ein Programm das Graphen oder so zeichnet?
 
Danke für deine Antwort, mal sehen ob es klappt...
Ne nicht wirklich, da aber kann man das machen Wie denn ? ^^
Die Funktion ist für ein kleines Konsolenspiel, und zwar Schiffe versenken ;)
 
Aber noch eine Frage warum muss man den srand(rand()*rand()) schreiben?
Außerdem geht das nur wenn ich davor noch ein srand(time(0)) schreibe, sonst gibt er wieder die gleichen aus
 
Aber noch eine Frage warum muss man den srand(rand()*rand()) schreiben?

Logisch gesehen ist es sinnlos, genauso wie rand()%5+1. Sogesehen könnte es auch so aussehen:

C:
#include <iostream>
#include <math.h>

void zufallskoordinaten(void) {
    int x1 = rand();
    srand(rand()*10000);
    int x2 = rand();

    x1 = round(x1%5) < 1 ? 1 : x1%5;
    x2 = round(x2%5) < 1 ? 1 : x2%5;

    std::cout << "X :" << x1 << " Y :" << x2 << "\n";
}


int main() {

    for(int i = 0; i < 50; i++) zufallskoordinaten();
    getchar();
    EXIT_SUCCESS;
    return 0;
    }
 
Mein Gott ... wenn man keine Ahnung hat :D

C++:
#include <iostream>
#include <cstdio>
#include <ctime>
#include <utility>

typedef std::pair <unsigned int, unsigned int> coordinate_t;

void init_random();
inline const coordinate_t random_coordinate();

int main() 
{
    init_random();
    
    for (unsigned char i(0); i < 50; ++i)
    {
        coordinate_t const& coord(random_coordinate());
        std::cout << "X: " << coord.first << " Y: " << coord.second << "\n";
    }
    
    return EXIT_SUCCESS;
}

void init_random()
{
    static bool ready(false);
    if (ready == false) { std::srand(static_cast<unsigned>(std::time(NULL))); read = true; }
}

inline const coordinate_t random_coordinate()
{ return std::make_pair(static_cast<unsigned int>((5 + 1) * std::rand() / (RAND_MAX + 1.0)), static_cast<unsigned int>((5 + 1) * std::rand() / (RAND_MAX + 1.0))); }
wenn du jetzt init_random benutzt ... kannst du es von mir aus so oft tun wie du willst :D Hab da mal ne Sperre reingebaut, damit es nur einmal die Initialisierungsfunktion aufruft ;)

Zu Zufällen: http://cplus.kompf.de/artikel/random.html
 
Hä ich check des überhauptnet was du da gemacht hast ^^
Ich will einfach eine Zahl zwischen 1 und 5, das sollte ja auch gehen, aber irgendwie nimmt er auch die 6 mit ich weiß auch nicht, warum, ichbenützte diese funktion hier :

Code:
int Spieler::Zufallszahl(void)
{
    return rand()%5+1;
    }

Die is halt dann in der klasse drin und wird dann in einer anderen Funktion der klasse "Spieler" aufgerufen in dieser Funktion steht dann auch das srand(time(0)) drin, aber irgendwie wills nicht so richtig funktionieren :(
 
Nein das srand hat in deinen Funktionen NICHTS zu suchen! Es sei denn du machst das so wie ich es mit init_random dir verdeutlichen wollte. Es darf nur EIN Mal aufgerufen werden. Dann ließ dir bitte mal den Link durch, den ich dir auch gepostet habe. Durch Module-Operator zu begrenzen ist nicht wirklich das Richtige ...
 
Ja, ich habs auch schon mit diesen Methoden versucht, es geht aber auch nicht, und ich habe es auch schon damit versucht indem ich das srand() nicht in eine funktion geschrieben habe, sondern in die mainfunktion, da hat es dann aber auch nicht geklappt, immer habe ich eins mehr bekommen als ich wollte, und durch das modulo wird ja nur das Gleichgewicht der Verteilung gestört, das ist mir eigentlich egal :D
 
Nein das srand hat in deinen Funktionen NICHTS zu suchen! Es sei denn du machst das so wie ich es mit init_random dir verdeutlichen wollte. Es darf nur EIN Mal aufgerufen werden. Dann ließ dir bitte mal den Link durch, den ich dir auch gepostet habe. Durch Module-Operator zu begrenzen ist nicht wirklich das Richtige ...

Ich darf srand so oft aufrufen wie ich lustig bin, nur ob es dann den Zweck erfüllt den ich will, nämlich Zufallszahlen die sich nicht ständig ähneln.

@Topic:

http://www.c-plusplus.de/forum/viewtopic-var-t-is-172876.html

Les dir das mal durch ;)
 
Zurück