Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Satunnaisluvun kanssa ongelmia...

ZuuZou [15.03.2010 14:50:39]

#

Eli ajattelin tässä että mikä on paras tyyli oppia ja totesin että se on kokeilu joten päätin alkaa väsäämään pientä teksti pohjaista peli... Tässä suunnittelu vaiheessa kuitenkin tuli semmoinen pulma vastaan että kun pelin pitäisi arpoa vihu, mutta en nyt oikeen ole keksinyt kuinka sen toteuttaisin...

Selailin tuossa noita vanhoja keskusteluja, mutta ei oikeen apua ole kun kaikissa eri selitykset ja eri koodit ja itsellä olisi tarkoituksena vain 1-3 saada arvottua.

Kiitos jo näin etukäteen.

Teuro [15.03.2010 15:19:59]

#

#include <ctime>
#include <iostream>
#include <cstdlib>

int arvo_luku(int ala, int yla);

int main(int kpl, char** argumentit){
    std::srand(std::time(NULL));
    int arvottu_luku = arvo_luku(1, 3);

    std::cout << arvottu_luku << std::endl;

    return EXIT_SUCCESS;
}

int arvo_luku(int ala, int yla){
    int tmp_luku;

    tmp_luku = ala + rand() % (ala + yla);

    return tmp_luku;
}

jlaire [15.03.2010 16:33:29]

#

Teuron koodissa on bugi: vaihtoehtojen lukumäärä on (yla - ala + 1) eikä (ala + yla).

int arvo_luku(int ala, int yla) {
    return ala + rand() % (yla - ala + 1);
}

Apumuuttujan käytöstä ei tässä ole minusta hyötyä, mutta se on toki makuasia.

Edit: Niin ja jos tuon toiminta ei ole täysin selvää, kannattaa lukea manuaalista mitä srand() ja rand() tekevät.

Teuro [15.03.2010 17:13:37]

#

Hups niin onkin väärin. Testasin pari kertaa ja sattumalta tuli tuolle välille numerot. Apumuuttujien tarkoitus oli hiukan selventää tuon "satunnaisen" luvun sijoitusta. Makuasia ehdottomasti kuitenkin.

tkok [15.03.2010 21:04:30]

#

Koodi ilmeisesti alustaa satunnaisluku generaattorin sekunti-arvolla, jolloin sekunnin aikana tuloksena on sama luku, ei siis kovin satunnainen.

Teuro [15.03.2010 21:19:06]

#

tkok kirjoitti:

Koodi ilmeisesti alustaa satunnaisluku generaattorin sekunti-arvolla, jolloin sekunnin aikana tuloksena on sama luku, ei siis kovin satunnainen.

Vain jos tuo tosiaan alustettaisiin ennen jokaista arvontaa, niin kyllä juuri näin.

#include <ctime>
#include <iostream>
#include <cstdlib>

int arvo_luku(int ala, int yla);

int main(int kpl, char** argumentit){
    std::srand(std::time(NULL));
    int arvottu_luku;
    int a = 0;

	while(a < 10){
		arvottu_luku = arvo_luku(10, 100);
		std::cout << arvottu_luku << std::endl;

		++a;
	}

    return EXIT_SUCCESS;
}

int arvo_luku(int ala, int yla){
    int tmp_luku;

    tmp_luku = ala + rand() % (yla - ala + 1);

    return tmp_luku;
}

Tulos: 10, 20, 71, 59, 43, 33, 80, 73, 37, 54

Sitten uusi veto

#include <ctime>
#include <iostream>
#include <cstdlib>

int arvo_luku(int ala, int yla);

int main(int kpl, char** argumentit){
    int arvottu_luku;
    int a = 0;

	while(a < 10){
		std::srand(std::time(NULL));
		arvottu_luku = arvo_luku(10, 100);
		std::cout << arvottu_luku << std::endl;

		++a;
	}

    return EXIT_SUCCESS;
}

int arvo_luku(int ala, int yla){
    int tmp_luku;

    tmp_luku = ala + rand() % (yla - ala + 1);

    return tmp_luku;
}

nyt tuloste on 10 kertaa 73

ZuuZou [17.03.2010 14:36:25]

#

Joo kiitos vastauksista! Pelastitte päiväni :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta