Permalänk

Slumpa tid

Hej alla

Undrar om någon vet hur man slumpar tid och inte siffror. Jag behöver få en slumpmässig tid mellan 3-7 sekunder, men jag får inte min kodning att stämma.

Finns det en vacker själ som kan hjälpa mig därute?

Min kodning för tillfället är:

int main() { cout << "ska sova..." << endl; srand(time(null)); usleep(3000 + 7000); cout << "vaken" << endl;

Infogat [code][/code] /Vzano, mod
Permalänk

Just nu slumpar du inte fram någon tid utan initierar bara din generator. Du behöver kalla på rand() för att få ett slumpmässigt nummer. Din nuvarande kod kommer alltid sova 10 s.

https://www.cplusplus.com/reference/cstdlib/srand/

https://www.cplusplus.com/reference/cstdlib/rand/

Permalänk
Medlem
Skrivet av Asianfoodie:

Hej alla

Undrar om någon vet hur man slumpar tid och inte siffror. Jag behöver få en slumpmässig tid mellan 3-7 sekunder, men jag får inte min kodning att stämma.

Finns det en vacker själ som kan hjälpa mig därute?

Min kodning för tillfället är:

int main()
{
cout << "ska sova..." << endl;

srand(time(null));
usleep(3000 + 7000);

cout << "vaken" << endl;

Slumpa ett tal mellan 0 och 4000
Lägg på 3000 (plussa)

Resultat: slumpat tal mellan 3000 och 7000

Permalänk
Skrivet av HerrNilsson54:

Just nu slumpar du inte fram någon tid utan initierar bara din generator. Du behöver kalla på rand() för att få ett slumpmässigt nummer. Din nuvarande kod kommer alltid sova 10 s.

https://www.cplusplus.com/reference/cstdlib/srand/

https://www.cplusplus.com/reference/cstdlib/rand/

Jag har kollat på bägge och jag förstår vad enskilda funktioner gör men jag lyckas inte få bägge funktionerna ihop. Jag får inte till med srand och rand samt sleep function ihop.

Skulle man kunna få tips på hur man gör x'D

Permalänk

int main() { cout << "ska sova..." << endl; srand(time(null)); usleep(3000 + (rand()%4000)); cout << "vaken" << endl; {

rand() kan returnera ett jättestort tal, men eftersom mod 4000 (%4000) utförs så kommer tala vara från 0 till 3999. Exakt samma som fanns i dokumentationen.

Permalänk
Skrivet av HerrNilsson54:

int main() { cout << "ska sova..." << endl; srand(time(null)); usleep(3000 + (rand()%4000)); cout << "vaken" << endl; {

rand() kan returnera ett jättestort tal, men eftersom mod 4000 (%4000) utförs så kommer tala vara från 0 till 3999. Exakt samma som fanns i dokumentationen.

Jag vet inte vad jag gör för fel men när jag testkör (debuggar) så skrivs "ska sova" och "vakna" på skärmen direkt och inte inväntar i någon sekund

Permalänk

Ojsan, blandade ihop micro och milli.... är 1 000 000 microsekunder på en sekund och inte 1000

usleep(3000000 + (rand()%4000000));

Permalänk
Skrivet av HerrNilsson54:

Ojsan, blandade ihop micro och milli.... är 1 000 000 microsekunder på en sekund och inte 1000

usleep(300000 + (rand()%400000));

Jag uppfattar det som att tiden inte slumpas utan de blir 7 sekunder varje gång jag testkör. Är det något mer man behöver koda så att det blir slumpmässigt? Kan man skriva usleep(3000000 + (srand() %4000000)); för att de ska slumpas?

Permalänk
Medlem
Skrivet av Asianfoodie:

Jag uppfattar det som att tiden inte slumpas utan de blir 7 sekunder varje gång jag testkör. Är det något mer man behöver koda så att det blir slumpmässigt? Kan man skriva usleep(3000000 + (srand() %4000000)); för att de ska slumpas?

Förutom att det är rand() och inte srand() du ska använda där så ska det resultera i att programmet sover mellan 3000000 och 7000000 mikrosekunder. Om du faktiskt använder srand() så där så borde koden inte kompilera.

Sen kan det vara bra att veta att rand() är en gammal C-funktion med en hel del problem, och i C++ bör man hellre använda random-biblioteket. I det här fallet spelar det ingen större roll, men vill du använda C++-funktionaliteten så är det std::uniform_int_distribution du letar efter.

Däremot skulle jag inte rekommendera att du använder usleep eftersom det inte en standardfunktion och ej portabel, och dessutom inte ens rekommenderad att använda på de plattformar som faktiskt har stöd för den. Ett bättre sätt i C++ är att använda std::this_thread::sleep_for, t.ex:

#include <thread> // För std::this_thread #include <chrono> // För std::chrono int main() { std::this_thread::sleep_for(std::chrono::seconds(7)); }

Permalänk
Skrivet av perost:

Förutom att det är rand() och inte srand() du ska använda där så ska det resultera i att programmet sover mellan 3000000 och 7000000 mikrosekunder. Om du faktiskt använder srand() så där så borde koden inte kompilera.

Sen kan det vara bra att veta att rand() är en gammal C-funktion med en hel del problem, och i C++ bör man hellre använda random-biblioteket. I det här fallet spelar det ingen större roll, men vill du använda C++-funktionaliteten så är det std::uniform_int_distribution du letar efter.

Däremot skulle jag inte rekommendera att du använder usleep eftersom det inte en standardfunktion och ej portabel, och dessutom inte ens rekommenderad att använda på de plattformar som faktiskt har stöd för den. Ett bättre sätt i C++ är att använda std::this_thread::sleep_for, t.ex:

#include <thread> // För std::this_thread #include <chrono> // För std::chrono int main() { std::this_thread::sleep_for(std::chrono::seconds(7)); }

Okej då fattar jag. Det jag har uppfattat så funkar usleep för c++ men de kanske är jag som har läst fel.

Men nu är ju frågan hur gör jag att det blir slumpmässig tid? Att de blir 3 sek, 5 sek, 7sek, 4sek. För nu blir det ju bara 7 sek?

Permalänk
Medlem
Skrivet av Asianfoodie:

Okej då fattar jag. Det jag har uppfattat så funkar usleep för c++ men de kanske är jag som har läst fel.

Men nu är ju frågan hur gör jag att det blir slumpmässig tid? Att de blir 3 sek, 5 sek, 7sek, 4sek. För nu blir det ju bara 7 sek?

Se det så här:

rand() ger dig vilket nummer som helt

x%4 betyder ’restklass vid division med fyra’
Alltså 1%4 = 1, 2%4 = 2, 3%4=3, 4%4 = 0, 5%4 = 1, 6%4 = 2, ...

Tar man ett slumpat tal, vilket som helst, och kör restklass-operatorn så ändras värdet till ett slumpat tal mellan 0 och talet minus 1

(rand() % 4000) ger alltså ett slumpat tal mellan 0 och 3999

Kör du sleep med ett sådant värde kommer väntetiden variera mellan de värdena

Det blir inte 4000 varje gång

Permalänk
Medlem
Skrivet av Asianfoodie:

Men nu är ju frågan hur gör jag att det blir slumpmässig tid? Att de blir 3 sek, 5 sek, 7sek, 4sek. För nu blir det ju bara 7 sek?

Kör du srand först? rand är en pseudoslumptalsgenerator, d.v.s. den är inte slumpmässig på riktigt utan använder en algoritm för att producera tal som ser slumpmässiga ut. För detta behöver den ett startvärde, eller slumpfrö, vilket är vad srand gör (s = seed). Så t.ex.:

int main() { srand(time(0)); // Använd den nuvarande tiden som slumpfrö std::cout << rand() << std::endl; // Skriv ut ett slumptal }

Se t.ex. denna sida för mer information om hur det fungerar.

Permalänk
Skrivet av medbor:

Se det så här:

rand() ger dig vilket nummer som helt

x%4 betyder ’restklass vid division med fyra’
Alltså 1%4 = 1, 2%4 = 2, 3%4=3, 4%4 = 0, 5%4 = 1, 6%4 = 2, ...

Tar man ett slumpat tal, vilket som helst, och kör restklass-operatorn så ändras värdet till ett slumpat tal mellan 0 och talet minus 1

(rand() % 4000) ger alltså ett slumpat tal mellan 0 och 3999

Kör du sleep med ett sådant värde kommer väntetiden variera mellan de värdena

Det blir inte 4000 varje gång

Skriver man då std::this_thread::sleep_for(std::chrono::seconds(3%4=1, 4%4=0, 5%4=1));

Permalänk
Medlem
Skrivet av Asianfoodie:

Skriver man då rand() 3%4=3, 4%4=0, 5%4=1, 6%4=2)); för att få det slumpmässigt ?

Va? Nej, den raden visade vad utfallet blir vid olika invärden, om du stoppar in 5 i x%4 blir det 1, stopper du in 42 så får du 2

rand är ju redan tillräckligt slumpmässig för dessa behov.

Det du måste göra är srand() innan (seed random function) så rand() börjar på något annat värde än default

Som inparameter på srand behövs något som inte är samma varje gång (till exempel tiden just nu)

Om du istället för att starta om programmet efter varje körning istället kör en for-loop och kör rand varje varv så kommer du se att den inte ger samma värde varje gång

https://www.cplusplus.com/reference/cstdlib/rand/