random volgorde

Status
Niet open voor verdere reacties.

stykurgh

Gebruiker
Lid geworden
6 jul 2009
Berichten
715
hallo, ik heb een proggramma gemaakt in DOS om mezelf te overhoren met duits. nu wil ik alleen dat de woorden in een random volgorde komen en dat die volgorde altijd anders is. ik heb zelf dit toegevoegd


srand((unsigned)time(0));

int a;

int lowest=1, highest=80;

int range=(highest-lowest)+1;

for(int index=0; index<80; index++){

a = lowest+int(range*rand()/(RAND_MAX + 1.0));


alleen het probleem is bij dit. en bij gewon srand etc dat hij heel vaak het zelfde woord geeft en er heel veel niet voor komen.
heeft iemand hier een oplossing voor?

mvg
michel
 
Probeer eens in plaats van [cpp]a = lowest+int(range*rand()/(RAND_MAX + 1.0));[/cpp]
[cpp]a = lowest+(rand()%range);[/cpp]
Dan krijg je wel verschillende getallen. Je zal ook enkele getallen dubbel krijgen en andere getallen uit de reeks 1-80 niet. Als je wilt dat alle getallen een keer gekozen worden zou je moeten bijhouden (bijv. in een boolean array) welke getallen al gekozen zijn en net zo lang een nieuw random getal laten kiezen tot er een is gekozen die nog niet geweest is.
 
bedankt,
maar hoe moet ik die array precies neerzetten? ik ben nog niet zo ongelooflijk goed met c++ xD misschien dat iemand me een begin kan geven. :D

mvg

michel
 
Ik zou zoiets doen
[cpp]bool gekozen[80];
for (int i=0;i<80;i++)
{
gekozen = false;
}[/cpp]

Een random getal genereren doe je dan zo:
[cpp]do
{
a = lowest+(rand()%range);
} while(gekozen[a-lowest]);
gekozen[a-lowest] = true;[/cpp]
 
ik heb het nu o


bool gekozen[100];
for (int i=0;i<100;i++)
{
gekozen = false;

}


int a;

int lowest=1, highest=100;

int range=(highest-lowest)+1;


do
{
a = lowest+(rand()%range);
} while(gekozen[a-lowest]);
gekozen[a-lowest] = true;



maar als ik hem nu run dan krijg ik 1 woord en dan sluit hij af. komt dit niet omdat zodra het 1x is uitgevoerd de bool op true staat en dan gewoon afsluit?
 
probeer dit eens:
[CPP]...
int a=0, int lowest=1, highest=100;
int i=lowest-1;
int range=(highest-lowest)+1;

do {
a = rand() % range + lowest;
if (gekozen[a]) {
gekozen[a] = true;
i++;
}
} while(i < highest);
...
[/CPP]

Zo kijk je of de waarde al waar is, mocht dit niet zijn, zet deze waarde dan op waar en hoog een index nummer met 1. Mocht dit index nummer gelijk of hoger zijn dan het hoogste nummer, weet je dat alle nummers zijn geweest en kan je stoppen.

groeten vreugde
 
ik heb nu dit
bool gekozen[100];
for (int s=0;s<100;s++)
{
gekozen = false;

}


int a=0,lowest=1, highest=100;
int i=lowest-1;
int range=(highest-lowest)+1;

do {
a = rand() % range + lowest;
if (gekozen[a]) {
gekozen[a] = true;
i++;
}
} while(i < highest);



maar als ik nu run dan geeft hij geen nummer en sluit hij direct af
 
Tijdens de do-while loop return je niets van een getal, dit moet je na iedere bepaling van een getal wel doen in bijvoorbeeld een functie of zo iets.

[CPP]...
do {
a = rand() % range + lowest;
if (gekozen[a]) {
gekozen[a] = true;
i++;
}
giveWord(a); /* Voeg een functie toe om het juiste woord op te tonen en antwoord erop te geven */
} while(i < highest);
[/CPP]

En de functie kan er dan zo uit zien
[CPP]
...
void class::giveWord(int a) {
switch(a) {
case 1: /* Geef woord en wacht op antwoord of zo iets */
...
}
}
...[/CPP]

Maar ik weet niet hoe jij het nu aanpak.

groeten vreugde
 
ik heb het gewoon zo:

if (a==1){
cout << "de topsport \n";
totaal +=1;
getline (cin,woord);
if (woord == "der Spitzensport")
cout << "goed\n";
else {
cout << "fout\n";
cout << "het goede antwoord moest zijn: der Spitzensport \n";
fout +=1;}
Sleep(500);
cout << "\n";}


voor elk woord. maar ik ga dat wel even proberen
 
Je kan dat ook dynamisch maken mocht je dat nog niet weten. Bijvoorbeeld zo:

In de main functie:
[CPP]bool gekozen[NUM_WORDS];
for (int s=0;s<100;s++) {
gekozen = false;
}

int a=0,lowest=1;
int i=lowest-1;
int range=(NUM_WORDS-lowest)+1;

do {
a = rand() % range + lowest;
if (gekozen[a]) {
gekozen[a] = true;
i++;
}

renderWord(a);
} while(i < NUM_WORDS);
[/CPP]

In de renderWord functie:
[CPP]
std::string word = "";
cout << arr_Dutch[a] << "\n";
getline (cin,word);

if (word == arr_German[a])
cout << "goed\n";
else
cout << "fout\n" << "het goede antwoord moest zijn: " << arr_German[a] << "\n";

Sleep(500);
[/CPP]

En de globale waardes:
[CPP]#define NUM_WORDS 100
arr_German[NUM_WORDS];
arr_Dutch[NUM_WORDS];[/CPP]
waarbij je beide arrays nog wel moet definiere met de juiste woorden in std:string

groeten vreugde
 
Als je aan array aanmaak in C++, wordt er een stuk geheugen gereserveerd zodat je als ontwikkelaar er snel en gemakkelijk bij kan.

Het aanmaken van een array is als volgt:
[CPP]#define NUM_WORDS 100
std::string arr_German[NUM_WORDS];
std::string arr_Dutch[NUM_WORDS];[/CPP]

Hiermee heb je nu twee arrays gedefineerd, en beide hebben een lengte van 100 (Komt door de define NUM_WORDS)
Deze 2 arrays zijn beide helemaal leeg, dus met andere woorden op plek arr_German[0] t/m arr_German[99] staat NULL.

Nu moet je deze twee nog vullen met de woorden die jij wilt dus bijvoorbeeld:
[CPP]arr_German[0] = "Wiener Schnitzel";
arr_German[1] = "Schlager"
...[/CPP]

en dit moet ook voor de nederlands woorden gedaan.

groeten vreugde
 
oke ik heb het nu xD alleen werkt dat renderword niet. hij zegt dat het niet is gedefineert.
 
Hiermee heb je nu twee arrays gedefineerd, en beide hebben een lengte van 100 (Komt door de define NUM_WORDS)
Deze 2 arrays zijn beide helemaal leeg, dus met andere woorden op plek arr_German[0] t/m arr_German[99] staat NULL.
*kuch* Die tweede zin slaat de plank mis, en slaat eigenlijk zelfs naast de plank.
Er is geen enkele garantie, en ik herhaal: geen enkele garantie, dat deze arrays effectief met NULL gevuld zijn. Je hebt enkel dat geheugenblokje gereserveerd, maar er nog niets mee gedaan: ook niet op NULL gezet.

Je kan het reserveren van een stukje geheugen vergelijken met het plaatsen van een omheining. Wanneer je een omheining in een veld plaatst, kan je enkel zeggen dat je dat stukje veld hebt omheind en dat het voor jou is en niemand anders. Je kan niet met zekerheid zeggen of er gras of een schaap op dat stukje stond toen je je omheining geplaatst hebt, en je weet dus ook niet zeker wat er binnen jouw omheining staat, tenzij je het er zelf zet.
 
Oke dank je wel voor je subtiele correctie, je kon ook zeggen dat een array nooit effectief gevuld is met een waarde tenzij je dit concreet aanbrengt in de code.

Natuurlijk kan je het normaal zeggen, maar he waarom zou je. Als jij een wat mindere dag heb moet je het zeker uitvreten op een helpende hand, groot gelijk hoor :thumb:
 
"Renderword[a]" is niet gedefinieerd. dus kan ik hem niet uitvoeren en ik zou niet weten wat ik daar neer moet zetten.
 
renderWord(a) was in mijn voorbeeld een verwijzing naar een functie die zo zou kunnen heten.

Wat ik hiermee bedoelde is dat je met de functie renderWord(int word_position) het woord kon bepalen.

Dus deze moet je zelf nog maken, maar heb hiervan al een klein voorbeeldje gegeven van hoe je het kan doen ;)

groeten vreugde
 
meer hints :D
ik kom er echt niet uit. krijg allemaal fout meldingen en zo en als ik hem uitvoer is er een fout etc
 
Aangezien ik geen Verenigingslid ben beschik ik niet over PM mogelijkheid, vandaar deze offtopic post.
Natuurlijk kan je het normaal zeggen, maar he waarom zou je. Als jij een wat mindere dag heb moet je het zeker uitvreten op een helpende hand, groot gelijk hoor :thumb:
Vreugde, hierbij mijn oprechte excuses omdat je je misschien aangevald voelde, dit was zeker niet mijn bedoeling. Je bent in deze thread zeker de helpende hand en doet waar HelpMij voor staat, je eigen kennis delen om anderen op weg te helpen.
Het is in diezelfde geest dat ik mijn antwoord formuleerde.

En ja, ik kon het op de 'normale' manier uitleggen: echter is mij al vaker gebleken dat zowel anderen als ikzelf dingen beter onthouden wanneer ze onconventioneel worden uitgelegd. Misschien vond u dat ik met mijn vergelijking te kinderachtig overkwam en uw programmeerkennis onderschatte. Begrijp echter dat mijn antwoord niet enkel aan u gericht was, maar evenzeer aan stykurgh, die eerder onervaren in de programmeerwereld lijkt te staan, alsook aan alle andere mensen die deze thread lezen uit interesse of op zoek naar een oplossing voor een gelijkaardig probleem.

Of misschien was het de herhaling en nadruk op 'geen enkele garantie' die u tegen de borst stootte. Ik heb deze fout zelf vaak genoeg gemaakt, met als gevolg soms (voor mij dan toch) moeilijk te debuggen programma's. Ik legde die nadruk enkel in de hoop dat het dan bij de lezer goed in het hoofd blijft hangen, zodat die niet dezelfde fout maakt, en de daarbijgaande frustratie hoeft te ondergaan.

En voor wat het waard is: gisteren had ik helemaal geen slechte dag, het tegendeel in feite. En zelfs al had ik een slechte dag: ik ben opgevoed om na te denken over wat je doet alvorens het te doen.. zeker wanneer het betreft het uitvreten van een helpende hand. Ik doe steeds mijn best om zo objectief mogelijk te reageren (en ja, dat lukt niet altijd), maar "Welkom op het internet.", emoties zijn (zelfs met smileys) moeilijk te achterhalen en soms wordt iets wel eens foutief begrepen: No hard feelings.

Ik hoop ook van harte dat wanneer ik iets foutiefs post, er iemand anders met onze ingesteldheid -u bvb- mij daarop komt te wijzen.


En om toch nog iets on topic te zeggen ook :rolleyes: :
stykurgh, kan je hier de code plaatsen zoals jij ze nu hebt? En eventueel ook de foutmeldingen die je hebt, zo maak je het voor vreugde veel eenvoudiger om je te helpen.
 
Laatst bewerkt:
#include <iostream>
#include <windows.h>
#include <string>
#include <cstdlib>
using namespace std;

int main()
{
#define NUM_WORDS 100


std::string arr_Dutch[NUM_WORDS];
arr_Dutch[0] = "de topsport";
arr_Dutch[1] = "het gewricht";


std::string arr_German[NUM_WORDS];
arr_German[0] = "der Spitzensport";
arr_German[1] = "das Gelenk";





bool gekozen[NUM_WORDS];
for (int s=0;s<100;s++) {
gekozen = false;
}

int a=0,lowest=1;
int i=lowest-1;
int range=(NUM_WORDS-lowest)+1;

do {
a = rand() % range + lowest;
if (gekozen[a]) {
gekozen[a] = true;
i++;}
} while(i < NUM_WORDS);{

#define Word_posision i
int Render_words[Word_posision];




std::string word = "";
cout << arr_Dutch[a] << "\n";
getline (cin,word);

if (word == arr_German[a])
cout << "goed\n";
else
cout << "fout\n" << "het goede antwoord moest zijn: " << arr_German[a] << "\n";

Sleep(500);


}

system ("pause");

return 0; }


ik heb dat xD alleen moet ik dat render words nog doen zodat hij bij het getal dat random wordt gekozen het juiste woord kiest. alleen ik weet niet echt hoe ik dat moet doen :D.
had wat geprobeerd maar dan wil het programma niet meer starten.

en ja ik sta idd onzeker hierin want ben nog niet zo heel erg lang bezig. vandaar dat ik er ook niet echt uit kom.
sorry voor dit.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan