GeirGrusom Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Poenget med rand funksjonen er ikke å lage tilfeldige tall, men å lage tall som har et spredningsområde over hele bitmønsteret både frem og tilbake. Vet du den nåværende seeden, kan du fint regne deg frem til neste tall i rekken gang etter gang. Det ville derimot ikke fungert på virkelig tilfeldige tall. Datamaskiner (og matematikk) er deterministiske av natur. Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Og dersom man ikke syns 'emulert' tilfeldighet er godt nok, kan man jo lage en enhet som måler bakgrunnstråling, og trekker ett tall fra resultatene man får ut derfra. Dog er ei heller det ekte tilfeldighet, da man, dersom man hadde kjent til absolutt alle startparameterne i forbindelse med universets skapelse, og hadde en korrekt modell, likevel kunne regnet seg til også dette tallet. Hvorfor trenger du noe mer tilfeldig enn det computermaskinen beregner for deg? Lenke til kommentar
Sokkalf™ Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Innen kryptografi o.l er det ofte ønskelig med noe helt tilfeldig. Har opplevd å bli bedt om å bevege på musa etc for å generere entropi for RNG under generering av nøkler for kryptografi. Lenke til kommentar
Senyor de la guerra Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Hvorfor trenger du noe mer tilfeldig enn det computermaskinen beregner for deg? Fordi, hvis jeg har bruk for flere verdier, vil disse komme i stigende rekkefølge med små intervall. Lenke til kommentar
Sokkalf™ Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Rekkefølgen trenger jo ikke å være stigende. Den vil følge et fast mønster basert på seed, men rekkefølgen vil gå i begge retninger. Intervallene vil heller ikke på noen måte være faste. Endret 22. januar 2010 av Sokkalf™ Lenke til kommentar
Senyor de la guerra Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Nei, koden er veldig tidsavhengig: Output, fire ulike kjøretidspunkt av programmet (ca. 2-5 sek mellomrom) 14378 28619 6495 2860 2648 28304 15969 13425 20713 14437 25482 370 10015 24470 681 6457 26270 23010 14486 22868 6189 10517 15349 26814 20376 15129 8540 14528 31525 9047 28428 18366 12326 28069 9843 26583 Klikk for å se/fjerne spoilerteksten nedenfor #include "stdafx.h" #include <iostream> #include <stdlib.h> #include <stdio.h> #include <time.h> using namespace std; int main() { srand ( time(NULL) ); int tall; for (int i = 1; i < 10; i++) cout << rand() << " "; cin.get(); return 0; } Klikk for å se/fjerne spoilerteksten nedenfor Endret 22. januar 2010 av Senyor de la guerra Lenke til kommentar
Sokkalf™ Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Ender nok opp sånn fordi tidspunktet ikke endrer seg mye. Bruk en annen verdi i tillegg til klokka som du adder til tidspunktet. I unix-verdenen er det vanlig å bruke PID (process ID). Lenke til kommentar
Senyor de la guerra Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Men er ikke PID en konstant da? Lenke til kommentar
Sokkalf™ Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 @GeirGrusom: :!: @Senyor: Nei, PID er ikke konstant, den endrer seg ved hver kjøring av programmet, og kan f.eks være 3421 den ene gangen og 24301 den andre gangen. Lenke til kommentar
Senyor de la guerra Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Ok, men hvordan plukker man ut PID til skriptet? Lenke til kommentar
GeirGrusom Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Linux: #include <sys/types.h> #include <unistd.h> int main(int argc, char** argv) { srand((int)getpid()); } Windows: #include <Windows.h> int main(int argc, char**argv) { srand((int)GetCurrentProcessId()); } Men jeg vet ikke om det er like fornuftig å gjøre det i Windows. Lenke til kommentar
Sokkalf™ Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Omtrent sånn: #include #include int main(int argc, char *argv[]) { pid_t p; p = getpid(); printf("PID: %u\n", p); return 0; } Edit: Slått Endret 22. januar 2010 av Sokkalf™ Lenke til kommentar
Senyor de la guerra Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Hmm... men da mister jo C++ litt av poenget i Windows. Jeg lærer i grunnen bare C++ slik at jeg har et språk hvor jeg kan kompliere programmer (hovedsaklig for matematiske problemer og simuleringer) andre kan kjøre i windows Linux programmering har jeg ett annet språk for... Endret 22. januar 2010 av Senyor de la guerra Lenke til kommentar
GeirGrusom Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 #ifdef WIN32 srand((int)GetCurrentProcesxsId()) #else srand((int)getpid()); #endif Lenke til kommentar
Senyor de la guerra Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 #ifdef WIN32 srand((int)GetCurrentProcesxsId()) #else srand((int)getpid()); #endif Forklaring? Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Det forteller preprocessoren at "srand((int)GetCurrentProcessId())" skal kjøres dersom operativsystemet er windows. Om det ikke er windows (OSX, Linux, Unix, etc.) skal "srand((int)getpid());" kjøres. Ikke noe hokus pokus. EDIT: Ooops - Jeg må slutte i copy/paste så mye på dette forumet (Ref: Inlegget under) Endret 22. januar 2010 av ze5400 Lenke til kommentar
GeirGrusom Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Oops, en x for mye i GetCurrentProcessId() ^^ Lenke til kommentar
Senyor de la guerra Skrevet 20. februar 2010 Del Skrevet 20. februar 2010 Urgh, floor vil ikke ta "int", og får denne med: "error C2296: '%' : illegal, left operand has type 'double'" med double. Skal regne tverrsummen. #include "stdafx.h" #include <iostream> #include <cmath> using namespace std; int main() { double number = 0; double rest = 11; double value = 0; double numberpart = 0; cin >> number; while (number > 9) { rest = number%10; value = value + rest; numberpart = number/10; number = floor(numberpart); } cout << value; cin.get(); return 0; } Lenke til kommentar
Senyor de la guerra Skrevet 20. februar 2010 Del Skrevet 20. februar 2010 Funker med liten justering. Noe tips for å få den til å kjøre med flere enn ti siffer? #include "stdafx.h" #include <iostream> #include <cmath> using namespace std; int main() { int number = 0; double rest = 0; double value = 0; double numberpart = 0; cout << "Tall: "; cin >> number; while (number > 9) { rest = number%10; value = value + rest; numberpart = number/10; number = floor(numberpart); } value = value + number; cout << "Tverrsummen er: " << value; cin >> number; return 0; } Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå