Programmeren in C/Berekeningen: verschil tussen versies

2.831 bytes toegevoegd ,  13 jaar geleden
k
Wijzigingen door 78.22.30.185 hersteld tot de versie na de laatste wijziging door Pjetter
k (Wijzigingen door 78.22.30.185 hersteld tot de versie na de laatste wijziging door Pjetter)
etc.
 
==Willekeurige getallen==
Er is een functie in de header "stdlib.h" die je een willekeurig getal geeft. De functie heet rand() (van het Engelse woord random, dat willekeurig betekent). Hij is simpel te gebruiken:
int i = rand();
Dat getal kan natuurlijk wel heel hoog worden, daarom is het misschien handig te gebruiken met een modulo:
int i = rand() % 5;
om het getal maximaal 4 te laten worden. In dit geval vraag je de rest van een deling van een getal n gedeeld door k, dit kan dus alle getallen opleveren van 0 tot en met k-1.
Beschouw het volgende stuk code:
{{code
|Taal= C
|Titel=
|Code=
<source lang=c>
#include <stdlib.h>
#include <stdio.h>
 
main()
{
int i;
int max=20;
for(i=0;i<5;i++){
printf("%i\n", rand()%20);
}
}
</source>
}}
Wanneer deze code gecompileerd wordt, en een aantal keer uitgevoerd wordt zal deze echter telken male dezelfde random tekenreeks op het scherm getoond worden. Dit is zo omdat er vele sequenties van random getallen beschikbaar zijn, het oproepen van rand() geeft gewoon het volgende getal uit die sequentie terug. Bij het begin van een programma wordt dus telkens dezelfde sequentie van voorafaan afgelopen. Gelukkig is hiervoor een oplossing. Door de functie <i>void srand(unsigned int seed)</i> toe te voegen bij het begin van de code is het mogelijk om een selectie van de randomsequentie te maken. Indien u voor de for los <i>srand(0)</i> zou toevoegen zou u terug hetzelfde resultaat krijgen als het vorige programma (er wordt dus standaard de sequentie gebruikt die samengaan met het nummer nul). Maar nu lost dit het probleem nog niet op. Onder Linux is het bijvoorbeeld mogelijk om de randomgenerator te <i>seeden</i> met de huidige systeemtijd. Dit kan er dan bijvoorbeeld uitzien als in volgende code:
{{code
|Taal= C
|Titel=
|Code=
<source lang=c>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
 
main(){
srand(time(NULL));
int i;
int max=20;
for(i=0;i<5;i++){
printf("%i\n", rand()%20);
}
}
</source>}}
De functie <i>time(NULL)</i> (vereist <i>#include <time.h> </i>) geeft gewoon de huidige systeemtijd in seconden (een grote integer) terug. Andere compilers en omgevingen hebben andere methodes om de random generator te seeden.
Maar een opmerking hier is toch op zijn plaats: in de informatica bestaat niets zoals een perfect willekeurig getal, tenzij hier extra exotische hardware aan toegevoegd wordt. Indien men in deze context bijvoorbeeld weet met welk getal de random generater geseed zal worden zal men alle random getallen op voorhand reeds bepalen. De reden hiervoor is simpel, een computer kan niets anders doen dan reageren volgens een geprogrammeerd patroon op zijn omgeving. Dit kan enkel meer complex gemaakt worden maar nooit uitgesloten worden.
 
<!-- ----------- Hieronder onderhoudsmeldingen -------------- -->
1.310

bewerkingen

Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.