Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Skrevet

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.

Videoannonse
Annonse
Skrevet

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?

Skrevet

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.

Skrevet (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 av Sokkalf™
Skrevet (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 av Senyor de la guerra
Skrevet

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

Skrevet

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.

Skrevet (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 :p

Endret av Sokkalf™
Skrevet (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 :hmm:

 

Linux programmering har jeg ett annet språk for... :wallbash:

Endret av Senyor de la guerra
Skrevet (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 :p

(Ref: Inlegget under)

Endret av ze5400
  • 5 uker senere...
Skrevet

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;
}

Skrevet

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;
}

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...