abonnement Unibet Coolblue Bitvavo
pi_115665844
quote:
0s.gif Op vrijdag 17 augustus 2012 00:13 schreef t4rt4rus het volgende:

[..]

/dev/random ...
quote:
0s.gif Op vrijdag 17 augustus 2012 00:16 schreef t4rt4rus het volgende:

[..]

xchg rax, rbx :)
?
pi_115666770
quote:
0s.gif Op vrijdag 17 augustus 2012 00:17 schreef thenxero het volgende:

[..]

[..]

?
/dev/random is random nummer generator in linux.
xchg rax, rdx is swappen tussen rax en rbx.
pi_115667047
oke
pi_115672584
quote:
0s.gif Op vrijdag 17 augustus 2012 00:13 schreef t4rt4rus het volgende:

[..]

/dev/random ...
Is niet altijd random in de zin dat het standaard statistische tests doorstaat, en wat erger is (vanuit wetenschappelijk oogpunt) is dat de gegenereerde nummers niet reproduceerbaar zijn (ook al haalt hij op gegeven moment wel een statistische test, het heeft geen betekenis).

quote:
0s.gif Op vrijdag 17 augustus 2012 00:46 schreef t4rt4rus het volgende:

[..]

/dev/random is random nummer generator in linux.
xchg rax, rdx is swappen tussen rax en rbx.
xchg is typisch langzamer dan gewone moves/stores. Het is schijnbaar handig om semaforen te implementeren (geen ervaring mee), maar anders spaart het wederom 1 register uit in ruil voor meer cycles voor de swap; i.e. geheugen vs snelheid, de aloude tradeoff.
Indien standaard C gebruikt wordt met correcte consts, dan gaat dit allemaal automatisch. Mocht xchg dus wel even snel zijn op je architectuur, of gebruikt jouw code echt al alle registers, dan kiest de compiler uit zichzelf xchg.

edit: const temporary in C, std::swap in C++; de standaard STD implementatie doet dit zelf al goed.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_115735563
quote:
0s.gif Op donderdag 16 augustus 2012 22:19 schreef thabit het volgende:

[..]
Goed random getallen produceren, dat is een vakgebied op zich. Ik zou vooral googlen naar wat mensen ermee gedaan hebben.
Ik heb er even mee zitten kloten, maar het is toch wel een heel gedoe om dit in C++ voor elkaar te krijgen. Toen zag ik opeens dat er prima random integer generators op internet zijn. Ik genereer daar in een mum van tijd 100,000 random ints. Die plak ik in een textbestandje en lees ik dan in C++ in een array. So far so good, maar als ik bij element 20,096 van mijn array kom, dan loopt mijn programma vast.

Toen dacht ik misschien dat mijn array gewoon niet groter kon worden dan 20,096 integers. Dat ben ik gaan testen door array[i]=i te doen voor i=0 tot i=100,000. Maar dat gaf geen problemen, dus daar zou het niet aan mogen liggen.

Als return value krijg ik 0xC0000005. Heb je enig idee waar het aan kan liggen? Dit is de code die ik gebruik (en die dus goed werkt tot de gevreesde 20,096) (random2.txt is een CSV-bestand):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void ReadInts(int randint[])
{
    char *inname = "random2.txt"; //contains random numbers 0 - 9999
    ifstream infile(inname);

    if (!infile) {
        cout << "There was a problem opening file "
             << inname
             << " for reading."
             << endl;
    }
    else cout << "Opened " << inname << " for reading." << endl;
    int k=0;
    randint[30000]; 

    string value;
    int result;
    while ( infile.good() )
    {
        getline ( infile, value, ',' );
        result=0;
        stringstream convert(value);
        if ( !(convert >> result) )
        {
            result = 0;
        }
        randint[k]=result;
        cout << "k = " << k << " en random number = " << result << endl;
        ++k;
    }

}
pi_115736479
Problem solved, had randomint verkeerd geinitialiseerd in mijn main :)
pi_115739014
Zijn er geen C(++)-voorbeelden/libraries die dat beter kunnen dan de standaardlibrary? Lijkt me toch wat makkelijker dan eerst een file moeten genereren.
pi_115740156
Klopt. Boost is volgens mij zo'n library. Maar de vorige keer dat ik een niet-standaard library probeerde te gebruiken was dat een drama :P .
pi_115742076
GSL is doorgaans wat makkelijker in gebruik.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_115746730
quote:
Nog een andere vraag trouwens: hoe kan je het beste goede random getallen produceren in C++? De snelheid van de methode is ook erg belangrijk. Met srand en rand krijg ik getallen die niet zo random lijken.
Misschien een beetje laat, maar over het algemeen is rand() een prima bron voor random getallen en alleen in geval van beveiliging kan ik me voorstellen dat je een betere random number generator wilt gebruiken.

Waarom heb je het idee dat de de getallen "niet zo random lijken"? En waarvoor wil je het gebruiken?
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115749052
Of rand() goed is hangt af van de compilercollectie. gsl_rng_rand heeft/had bijvoorbeeld een duidelijk probleem. IBM's randu-functie was schijnbaar ook niet zo'n succes. Met een beetje ongeluk kom je ze nog tegen in de praktijk.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_115775211
quote:
3s.gif Op zondag 19 augustus 2012 12:14 schreef trancethrust het volgende:
GSL is doorgaans wat makkelijker in gebruik.
Meneer zit op Windows... :P
pi_115777287
quote:
0s.gif Op zondag 19 augustus 2012 15:04 schreef GS42 het volgende:

[..]

Misschien een beetje laat, maar over het algemeen is rand() een prima bron voor random getallen en alleen in geval van beveiliging kan ik me voorstellen dat je een betere random number generator wilt gebruiken.

Waarom heb je het idee dat de de getallen "niet zo random lijken"? En waarvoor wil je het gebruiken?
Ik heb het nodig voor statistische technieken in de wiskunde, waarbij ik heel snel achter elkaar random numbers wil genereren die niet van elkaar afhankelijk zijn. Dat lukte me niet met srand met de tijd als seed als ik het heel snel achter elkaar deed. Ik zag iedere keer ongeveer hetzelfde patroon erin zitten. Op google vond ik ook dat je voor serieuze taken beter iets anders gebruikt.
pi_115777578
quote:
0s.gif Op maandag 20 augustus 2012 10:47 schreef t4rt4rus het volgende:

[..]

Meneer zit op Windows... :P
Dan wordt het ook moeilijker dan noodzakelijk.

quote:
0s.gif Op maandag 20 augustus 2012 11:56 schreef thenxero het volgende:

[..]

Ik heb het nodig voor statistische technieken in de wiskunde, waarbij ik heel snel achter elkaar random numbers wil genereren die niet van elkaar afhankelijk zijn.
...
Dat komt omdat (zelfs al gebruikt je installatie een betere RNG dan de twee die ik hierboven als voorbeeld aanhaalde), doordat rand() doorgaans een linear congruential RNG (LC-RNG) is. Als ik een gok doe dan ben je bezig met monte-carlo methoden, en voor zulke punt-gebaseerde methodes kun je bewijzen dat voor elke LC-RNG altijd een dimensie d is waarvoor de gegenereerde punten rond vlakken in die d-dimensionale ruimte clusteren.
De oplossing is inderdaad om een niet LC-RNG te gebruiken (je kan ook de code van de wiki-pagina over de Mersenne-twister testen), of je kiest simpelweg een LC-RNG die het wel goed doet voor jouw d.

Ten tweede, als je met `heel snel' richting high-performance computing wil gaan, raad ik je ten sterkste aan toch op linux verder te gaan. Je krijgt simpelweg betere performance (zeker wanneer je multithreaded gaat) en in de industrie zelf (incl. de academici overigens) is er nagenoeg niemand die serieus in Windows werkt.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_115778638
Oke, ik zal later naar Linux gaan kijken. Voor nu is het al een hele stap vooruit in de performance van Matlab naar C++. Voor nu voldoet mijn gedownloadde txt bestand met random numbers, en het werkt al een stuk sneller dan gehoopt, maar het is inderdaad niet ideaal.
pi_115779183
quote:
0s.gif Op maandag 20 augustus 2012 11:56 schreef thenxero het volgende:

[..]

Ik heb het nodig voor statistische technieken in de wiskunde, waarbij ik heel snel achter elkaar random numbers wil genereren die niet van elkaar afhankelijk zijn. Dat lukte me niet met srand met de tijd als seed als ik het heel snel achter elkaar deed. Ik zag iedere keer ongeveer hetzelfde patroon erin zitten. Op google vond ik ook dat je voor serieuze taken beter iets anders gebruikt.
Je gebruikt srand() toch wel maar 1 keer he? Als je rand() gebruikt in je programma, roep je maar 1 enkele keer srand() aan, als eerste statement in je main(); op een andere plek of vaker is fout.

Verder klopt het dat je voor serieuze taken beter een aparte library kan gebruiken, maar dan moet je wel erg serieus zijn. ;) Ik heb bijvoorbeeld voor mijn bachelorscriptie - een implementatie van een monte-carlo (= statistische classificatie) zoekalgoritme - gewoon de rand() gebruikt zonder problemen.
"Slechts diegene mag slopen die iets beters kan bouwen."
  dinsdag 21 augustus 2012 @ 19:08:13 #67
189216 netolk
maar dan andersom
pi_115833350
quote:
0s.gif Op maandag 20 augustus 2012 12:59 schreef GS42 het volgende:

[..]

Je gebruikt srand() toch wel maar 1 keer he? Als je rand() gebruikt in je programma, roep je maar 1 enkele keer srand() aan, als eerste statement in je main(); op een andere plek of vaker is fout.

Verder klopt het dat je voor serieuze taken beter een aparte library kan gebruiken, maar dan moet je wel erg serieus zijn. ;) Ik heb bijvoorbeeld voor mijn bachelorscriptie - een implementatie van een monte-carlo (= statistische classificatie) zoekalgoritme - gewoon de rand() gebruikt zonder problemen.
ik zou sowieso zo vaak mogelijk de std functies gebruiken ipv. zelf maken of uit externe libs halen
Beware of the Raping Zebra's
pi_116017028
Ik heb een txt-bestandje gemaakt waarbij getallen links staan en rechts hun priemfactoren, gescheiden door witte ruimte. Het ziet er dus uit als volgt:

1
2
3
4
5
6
7
8
9
2 2
3 3
4 2 2
5 5
6 2 3
7 7
8 2 2 2
9 3 3
10 2 5
etcetera.

Nu wil ik dit bestandje lezen en in een array zetten. Maar omdat iedere regel een andere lengte kan hebben, weet ik niet hoe ik dat moet doen. Iemand een idee?
pi_116017177
quote:
0s.gif Op zondag 26 augustus 2012 11:33 schreef thenxero het volgende:
Ik heb een txt-bestandje gemaakt waarbij getallen links staan en rechts hun priemfactoren, gescheiden door witte ruimte. Het ziet er dus uit als volgt:
[ code verwijderd ]

etcetera.

Nu wil ik dit bestandje lezen en in een array zetten. Maar omdat iedere regel een andere lengte kan hebben, weet ik niet hoe ik dat moet doen. Iemand een idee?
Waarom geen vector gebruiken?
pi_116017883
quote:
0s.gif Op zondag 26 augustus 2012 11:33 schreef thenxero het volgende:
Ik heb een txt-bestandje gemaakt waarbij getallen links staan en rechts hun priemfactoren, gescheiden door witte ruimte. Het ziet er dus uit als volgt:
[ code verwijderd ]

etcetera.

Nu wil ik dit bestandje lezen en in een array zetten. Maar omdat iedere regel een andere lengte kan hebben, weet ik niet hoe ik dat moet doen. Iemand een idee?
Gaat het om het inlezen of om het opslaan? De oplossing voor het tweede is al gegeven door thabit: gewoon een vector gebruiken in plaats van een array. Het inlezen zou ik als volgt doen:

Het bestand per regel inlezen met getline (díe getline, er is ook een andere). Per regel stop je dan de string die je hebt gelezen in een std::istringstream. Uit de stringstream kan je daarna getallen halen met operator>>.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_116019780
quote:
0s.gif Op zondag 26 augustus 2012 12:06 schreef GS42 het volgende:

[..]

Gaat het om het inlezen of om het opslaan? De oplossing voor het tweede is al gegeven door thabit: gewoon een vector gebruiken in plaats van een array. Het inlezen zou ik als volgt doen:

Het bestand per regel inlezen met getline (díe getline, er is ook een andere). Per regel stop je dan de string die je hebt gelezen in een std::istringstream. Uit de stringstream kan je daarna getallen halen met operator>>.
Ik zou std::getline gebruiken en niet std::basic_istream::getline.
http://en.cppreference.com/w/cpp/string/basic_string/getline
pi_116019868
quote:
0s.gif Op zondag 26 augustus 2012 13:03 schreef t4rt4rus het volgende:

[..]

Ik zou std::getline gebruiken en niet std::basic_istream::getline.
http://en.cppreference.com/w/cpp/string/basic_string/getline
Dan zijn we het eens: jouw getline is dezelfde als de mijne. ;)
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_116020201
quote:
0s.gif Op zondag 26 augustus 2012 13:06 schreef GS42 het volgende:

[..]

Dan zijn we het eens: jouw getline is dezelfde als de mijne. ;)
Als ik op die link van je klik kom ik toch ergens anders uit.

edit:

ohnee toch niet :P
pi_116020349
De reden dat ik het met een array wilde doen is omdat ik dezelfde 'layout' wil als in dat textbestand: een 2-dimensionaal ding. Met vector heb je altijd 1 dimensie voor zover ik weet.
pi_116020443
quote:
0s.gif Op zondag 26 augustus 2012 13:20 schreef thenxero het volgende:
De reden dat ik het met een array wilde doen is omdat ik dezelfde 'layout' wil als in dat textbestand: een 2-dimensionaal ding. Met vector heb je altijd 1 dimensie voor zover ik weet.
1std::vector< std::vector<unsigned> >

Als je wilt kan het ook in een array van unsigned-pointers, maar dan moet je dynamisch alloceren en ergens de lengte van elke array opslaan om deze te kunnen gebruiken.

Oh, eventueel zou je ook een array van vectoren kunnen gebruiken, als je weet hoeveel regels je bestand heeft en dit niet verandert.
"Slechts diegene mag slopen die iets beters kan bouwen."
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')