Random
Uppgiften är :
och lösningen är ;
hänger inte med vad de gör i rad 15 och 16 .
Rad 16 slumpar fram ett värde mellan den övre och den undre gränsen, lika fördelat.För slumptalet använder man c's slumptalsgenerator och genererar s k pseudoslumptal vilka inte alls är slumpmässiga utan utgår från ett värde som är det samma ursprungligen. Det innebär att man vid varje körning av programmet får samma slumptal och det kan va bra ur en test- och felsökningssynpunkt men om man vill ha slumpmässiga värden som ändras vid varje körning så kan man initiera slumptalsgeneratorn med ett valfritt tal och det är vad man gör på rad 15 där man använder sig av datorns klocka, i heltalsformat som long, för att sätta startvärdet. Det kallas seed på engelska, som i frö. Klockan ändras mellan varje körning och då blir slumptalen slumpmässiga "på riktigt".
Hur går det om man t.ex. matar in upper = 20 och lower = 21?
random = rand() % (upper - lower + 1) + lower;
rand() ger ett heltal i intervallet [1,RAND_MAX] (max varierar med kompilator) man vill få in det värdet i intervalet [lower,upper] så man tar reda på först hur stort intervallet är upper-lower+1
Exempel
lower upper för en normal tärning är 1,6 då blir upper - lower + 1 = 6
så man tar det värdet och gör modulu på det så fås värden tillbaka i intervallet [0,5] så lägger man till 1 så blir det [1,6]
modulu % är samma som formulan
a - n * trunc(a / n)
Exempel
Om rand() returnerar 14
14 % 6 = 14 - 6 * 2 = 2
(sedan lägger man till 1 eftersom % returnerar inom [0,n-1])
3 blir talet
[0, RAND_MAX] faktiskt.
Laguna skrev:[0, RAND_MAX] faktiskt.
Ja just det, typo
anders_k skrev:random = rand() % (upper - lower + 1) + lower;
rand() ger ett heltal i intervallet [1,RAND_MAX] (max varierar med kompilator) man vill få in det värdet i intervalet [lower,upper] så man tar reda på först hur stort intervallet är upper-lower+1
Exempel
lower upper för en normal tärning är 1,6 då blir upper - lower + 1 = 6
så man tar det värdet och gör modulu på det så fås värden tillbaka i intervallet [0,5] så lägger man till 1 så blir det [1,6]
modulu % är samma som formulan
a - n * trunc(a / n)
Exempel
Om rand() returnerar 14
14 % 6 = 14 - 6 * 2 = 2
(sedan lägger man till 1 eftersom % returnerar inom [0,n-1])3 blir talet
Så för att få en slumpmässigt tal så meste man få ett värde från srand (time(NULL)) ??
I am Me skrev:Så för att få en slumpmässigt tal så meste man få ett värde från srand (time(NULL)) ??
nej, slumptalet kommer från rand()
srand(unsigned) använder man för att "seeda" slumpgeneratorn.
Man kan säga att rand() levererar en talföljd, för en seed levereras en och samma talföljd så genom att ta time(NULL) som seed så blir rand() lite mer slumpmässigt eftersom man inte vet vilken talföljd som kommer.
Man kan säga att man med srand levererar slumpen. Allt efter det är inte slumpmässigt alls i matematisk mening, bara ganska oförutsägbart.
Om du kör programmet igen med samma slumpfrö (du får spara värdet på time(NULL) i så fall) så får du precis samma tal från rand som gången innan.
anders_k skrev:I am Me skrev:Så för att få en slumpmässigt tal så meste man få ett värde från srand (time(NULL)) ??
nej, slumptalet kommer från rand()
srand(unsigned) använder man för att "seeda" slumpgeneratorn.
Man kan säga att rand() levererar en talföljd, för en seed levereras en och samma talföljd så genom att ta time(NULL) som seed så blir rand() lite mer slumpmässigt eftersom man inte vet vilken talföljd som kommer.
Ok, om jag har förstått rätt, så rand() funktionen ger ett nytt värde inom en viss gräns för varje gång den anropas och för att få en talföljd med slumpmässiga tal måste man använda en loop-sats och för att olika slumpmässiga tal för varje gång vi kör rand() så använder man time(NULL) . Då kommer funktionen rand() arbeta utifrån det och ge ett nytt värde för varje gång koden körs.
Men var kom 14 ifrån i ditt exempel?
I am Me skrev:anders_k skrev:I am Me skrev:Så för att få en slumpmässigt tal så meste man få ett värde från srand (time(NULL)) ??
nej, slumptalet kommer från rand()
srand(unsigned) använder man för att "seeda" slumpgeneratorn.
Man kan säga att rand() levererar en talföljd, för en seed levereras en och samma talföljd så genom att ta time(NULL) som seed så blir rand() lite mer slumpmässigt eftersom man inte vet vilken talföljd som kommer.
Ok, om jag har förstått rätt, så rand() funktionen ger ett nytt värde inom en viss gräns för varje gång den anropas och för att få en talföljd med slumpmässiga tal måste man använda en loop-sats och för att olika slumpmässiga tal för varje gång vi kör rand() så använder man time(NULL) . Då kommer funktionen rand() arbeta utifrån det och ge ett nytt värde för varje gång koden körs.
Men var kom 14 ifrån i ditt exempel?
14 var bara ett exempel.
srand skall bara ropas en gång, då får du en slumpmässigt vald talföljd med pseudoslumptal som levereras från rand()
Ja det hänger jag med att srand ropas bara en gång. Men rand() ropas flera gånger om man vill få en talföljd med slumpmässiga tal.