Miten C:lla saisi satunnaisluvun 0-10 väliltä?
Satunnaisluku
virittäjä
71761
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Turvaa tilisi vahvistamalla puhelinnumerosi. Voit silloin palauttaa unohtuneen salasanan tekstiviestillä.
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
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.
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.
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.
"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...
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;
}