11 svar
166 visningar
I am Me 711
Postad: 19 okt 2022 22:41

Random

Uppgiften är :

och lösningen är ;

hänger inte med vad de gör i rad 15 och 16 . 

CurtJ 1201
Postad: 19 okt 2022 23:05

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".

Laguna Online 30472
Postad: 19 okt 2022 23:24

Hur går det om man t.ex. matar in upper = 20 och lower = 21?

anders_k 237
Postad: 20 okt 2022 07:10
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

Laguna Online 30472
Postad: 20 okt 2022 14:42

[0, RAND_MAX] faktiskt.

anders_k 237
Postad: 20 okt 2022 17:54
Laguna skrev:

[0, RAND_MAX] faktiskt.

Ja just det, typo

I am Me 711
Postad: 21 okt 2022 12:00
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)) ??

anders_k 237
Postad: 21 okt 2022 16:31 Redigerad: 21 okt 2022 16:34
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.

 

 

Laguna Online 30472
Postad: 21 okt 2022 18:47

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.

I am Me 711
Postad: 22 okt 2022 12:46
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? 

anders_k 237
Postad: 22 okt 2022 13:23 Redigerad: 22 okt 2022 13:24
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()

I am Me 711
Postad: 22 okt 2022 14:05

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. 

Svara
Close