Satunnaisluku

Miten C:lla saisi satunnaisluvun 0-10 väliltä?
71761
Äänestä

Muut lukivat myös

Vastaukset 7

Vanhimmat

#include
#include
#include

void main( void)
{
int i;

/* alustus */
srand( (unsigned)time( NULL ) );

for( i = 0; i < 100;i++ )
printf( " %d
", rand() % 10 );
}

Muista alustaa satunnaisluku-generaattori tuolla stand():illa, muuten ohjelmasi tuottaa joka ajokerralla samat satunnaisluvut :o

rand() tuottaa satunnaisluvun välillä 0 - RAND_MAX, jos haluat luvun väliltä 1 - 10, niin käytä modulo-operaattoria.

Äänestä
  • man 3 rand kertoo tuosta modulo-operaation käyttämisestä näin:

    "If you want to generate a random integer between 1 and 10, you should always do it by using high-order bits, as in
    j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
    and never by anything resembling
    j=1+(rand() % 10);
    (which uses lower-order bits)."

    main on sitten int main(..)

    Äänestä

  • Mik kirjoitti:

    man 3 rand kertoo tuosta modulo-operaation käyttämisestä näin:

    "If you want to generate a random integer between 1 and 10, you should always do it by using high-order bits, as in
    j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
    and never by anything resembling
    j=1+(rand() % 10);
    (which uses lower-order bits)."

    main on sitten int main(..)

    Linuxin rand-funktioon liittyvä huomautus "...you should always do it by using high-order bits..." pätee siis vain Linuxiin, C:n kanssa asialla ei ole mitään tekemistä. Eikä taida Linuxissakaan olla enää moista vaivaa, joten unohdetaan tuo huomautus saman tien.

    Sen sijaan kaksi seikkaa pistää silmään. Jos halutaan kokonaisluku (integer) väliltä 0-10 kuten alkuperäisessä kysymyksessä, onpa todella tyhmää sotkea mukaan liukulukuja.

    Toinen seikka, eli käytettiinpä skaalauksessa jakoa tai moduloa, on varauduttava siihen, että rand-lukujen joukko (RAND_MAX 1) ei ole tasan jaollinen halutun lukualueen lukujen määrällä (11). Ellei tätä huomioida, tuloksena on todennäköisesti painotettuja satunnaislukuja.

    Äänestä

  • Mik kirjoitti:

    man 3 rand kertoo tuosta modulo-operaation käyttämisestä näin:

    "If you want to generate a random integer between 1 and 10, you should always do it by using high-order bits, as in
    j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
    and never by anything resembling
    j=1+(rand() % 10);
    (which uses lower-order bits)."

    main on sitten int main(..)

    Joo, kyllä minuakin häiritsi tuo void main(void), mutta pätkä on suoraan Visual C :n helpistä. Halusin kuitenkin laittaa täydellisen koodinpätkän, koska siinä oli nuo tarvittavat include-lauseet joita aloittelija saisi arpoa jonkin aikaa.

    Äänestä

  • Sinivuokko kirjoitti:

    Linuxin rand-funktioon liittyvä huomautus "...you should always do it by using high-order bits..." pätee siis vain Linuxiin, C:n kanssa asialla ei ole mitään tekemistä. Eikä taida Linuxissakaan olla enää moista vaivaa, joten unohdetaan tuo huomautus saman tien.

    Sen sijaan kaksi seikkaa pistää silmään. Jos halutaan kokonaisluku (integer) väliltä 0-10 kuten alkuperäisessä kysymyksessä, onpa todella tyhmää sotkea mukaan liukulukuja.

    Toinen seikka, eli käytettiinpä skaalauksessa jakoa tai moduloa, on varauduttava siihen, että rand-lukujen joukko (RAND_MAX 1) ei ole tasan jaollinen halutun lukualueen lukujen määrällä (11). Ellei tätä huomioida, tuloksena on todennäköisesti painotettuja satunnaislukuja.

    "on varauduttava siihen, että rand-lukujen joukko (RAND_MAX 1) ei ole tasan jaollinen halutun lukualueen lukujen määrällä"

    Äänestä

  • ??? kirjoitti:

    "on varauduttava siihen, että rand-lukujen joukko (RAND_MAX 1) ei ole tasan jaollinen halutun lukualueen lukujen määrällä"

    Mikä on lopputulos? Miten se kannattaa tehdä ja miten ei..

    Esimerkki...

    Äänestä

  • hmmm.. kirjoitti:

    Mikä on lopputulos? Miten se kannattaa tehdä ja miten ei..

    Esimerkki...

    Tämäkin koodi tuottaa painotettuja satunnaislukuja, mutta virhe on marginaalisen pieni ja tuskin tulee käytännössä esiin. Argumenttina (r) on annettava satunnaisluvun maksimiarvo (0...RAND_MAX).


    unsigned random(unsigned r)
    {
        unsigned m, v;

        m = (RAND_MAX + 1) / ++r;
        v = rand();

        if (v < m * r)
            v %= r;
        else if (v % 2)
            v = random(r - r / 2 - 1) + r / 2;
        else
            v = random(r / 2 - 1);

        return v;
    }

    Äänestä

Kommentoi aloitusta


virittäjä kirjoitti:

Miten C:lla saisi satunnaisluvun 0-10 väliltä?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu