Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.
Toen ik op de TU Delft zat, had ik een goed betaalbare uitvoering (campuslicentie); geen idee wat het normaal kost. Het wordt gemaakt door een universiteit in Canada.
30Drie Web Design & IT Consultancy | Raven Consultancy Services
Ik zie dat dat R-project ongeveer vergelijkbaar is met S-plus, maar dan opensource.
[ Voor 25% gewijzigd door Bluestorm op 07-11-2005 12:16 ]
Tenminste... dat [ denk / zie / weet ] ik... | Javascript obfuscator | foto's en video's uploaden
Dat is prima geschikt voo rdergelijke mogelijkheden in een command prompt.
Matlab heeft dan als bijkomend voordeel dat je van de uitkomsten heel makkelijk grafiekjes kunt maken, etc.
Tenminste... dat [ denk / zie / weet ] ik... | Javascript obfuscator | foto's en video's uploaden
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
13
| N<-10000 # aantal simulaties
pers<-23 #aantal personen
data<-1:365
uit<-0
for (i in 1:N) # doe het experiment N maal
{
trek<-sample(data,pers,replace=TRUE) # trek 'pers' verjaardagen
trek1<-outer(trek,trek,"-")-diag(pers) # matrix met alle dagen vergeleken
if ( any(trek1==0) ) uit=uit+1/N # check zelfde dag jarig
}
cat (uit) # uitkomst |
Niks mis mee, maar aangezine de TS zelf al java en C-bla noemt neem ik aan dat hij daar meer mee bekend is. Dus als compileer programma's is hij al voorzien. Kijk, je kunt dit met elke taal programeren als hij maar floating point variabelen ondersteund.frickY schreef op maandag 07 november 2005 @ 12:34:
Waarom noemt niemand de taal Pascal?
Dat is prima geschikt voo rdergelijke mogelijkheden in een command prompt.
Ook goed om mee te zoeken:
[google=birhtday paradox programming] om implementaties hiervan te vinden in verschillende talen. Valt me op dat ocaml hier vaker bij voor komt.
Verder lijkt het me handig een taal te kiezen die vaker nodig zult hebben en waar je om hulp kunt vragen met je mede studenten/leerlingen. Overigens bestaat [ulr=http://en.wikipedia.org/wiki/BASIC_programming_language]Basic ook nog gewoon hoor[/url]
Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.
Bedankt voor de code, maar welke taal is het en in welk programma kan ik het invoeren en uit laten voeren?Verwijderd schreef op maandag 07 november 2005 @ 13:02:
de R code:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13N<-10000 # aantal simulaties pers<-23 #aantal personen data<-1:365 uit<-0 for (i in 1:N) # doe het experiment N maal { trek<-sample(data,pers,replace=TRUE) # trek 'pers' verjaardagen trek1<-outer(trek,trek,"-")-diag(pers) # matrix met alle dagen vergeleken if ( any(trek1==0) ) uit=uit+1/N # check zelfde dag jarig } cat (uit) # uitkomst
Werk hard als je tijd hebt, dan heb je tijd als je hard moet werken.
Verwijderd
Verwijderd schreef op maandag 07 november 2005 @ 11:42:
Jij hebt dit nodig:
http://www.r-project.org/
Gratis, goed, doeltreffend, en niet moeilijk.
[ Voor 14% gewijzigd door Verwijderd op 07-11-2005 13:55 ]
Hoezo dat? Een simpele berekening voor de statistiek 1 miljoen keer uitvoeren zal in C/C++ merkbaar sneller gaan dan in VB6. Your point being?Tubby schreef op maandag 07 november 2005 @ 11:20:
Mja, simpele berekeningen doen met java/c# klinkt als een mug dood willen krijgen met een sloopkogel.
Sorry, niet echt goed opgelet. Ben nu nog op school, maar als ik straks thuis ben installeer ik het meteen en voer ik de code in. Alvast bedankt.Verwijderd schreef op maandag 07 november 2005 @ 13:50:
Mijn eerdere post en bovenstaande code horen bij elkaar.
[...]
Werk hard als je tijd hebt, dan heb je tijd als je hard moet werken.
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
33
34
35
36
37
38
39
40
41
42
43
44
45
| #include <iostream> #include <time.h> using namespace std; // Constants for use in the application const int c_Iterations = 10000; const int c_GroupSize = 23; const int c_DaysInYear = 365; // main: Entry point for the application int main() { int l_Group[c_GroupSize]; int l_Clashes = 0; int l_Index; int l_SubIndex; int l_Iteration; // Randomize srand((unsigned int)time(NULL)); // Repeat for all iterations for(l_Iteration = 0; l_Iteration != c_Iterations; l_Iteration++) { // Fill group with random birthdays for(l_Index = 0; l_Index != c_GroupSize; l_Index++) l_Group[l_Index] = (rand() * c_DaysInYear) / RAND_MAX; // Check for collisions for(l_Index = 0; l_Index < c_GroupSize; l_Index++) for(l_SubIndex = l_Index + 1; l_SubIndex < c_GroupSize; l_SubIndex++) if(l_Group[l_Index] == l_Group[l_SubIndex]) { l_Clashes++; l_Index = c_GroupSize; break; } } // Output results cout << "Clashes: " << l_Clashes << endl; cout << "Hit % : " << (double)l_Clashes * 100 / c_Iterations << endl; cin.get(); return 0; } |
Kun je zelf kijken of je het te moeilijk vind
[ Voor 3% gewijzigd door curry684 op 07-11-2005 14:15 . Reden: vector was wat overkill... ]
Dankje, ik zal het eens invoeren in een C++ progje en kijken.curry684 schreef op maandag 07 november 2005 @ 14:07:
Hier heb je de C++ versie:
C++:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 #include <iostream> #include <time.h> using namespace std; // Constants for use in the application const int c_Iterations = 10000; const int c_GroupSize = 23; const int c_DaysInYear = 365; // main: Entry point for the application int main() { int l_Group[c_GroupSize]; int l_Clashes = 0; int l_Index; int l_SubIndex; int l_Iteration; // Randomize srand((unsigned int)time(NULL)); // Repeat for all iterations for(l_Iteration = 0; l_Iteration != c_Iterations; l_Iteration++) { // Fill group with random birthdays for(l_Index = 0; l_Index != c_GroupSize; l_Index++) l_Group[l_Index] = (rand() * c_DaysInYear) / RAND_MAX; // Check for collisions for(l_Index = 0; l_Index < c_GroupSize; l_Index++) for(l_SubIndex = l_Index + 1; l_SubIndex < c_GroupSize; l_SubIndex++) if(l_Group[l_Index] == l_Group[l_SubIndex]) { l_Clashes++; l_Index = c_GroupSize; break; } } // Output results cout << "Clashes: " << l_Clashes << endl; cout << "Hit % : " << (double)l_Clashes * 100 / c_Iterations << endl; cin.get(); return 0; }
Kun je zelf kijken of je het te moeilijk vindC# en Java zijn een tikkie simpeler.
Werk hard als je tijd hebt, dan heb je tijd als je hard moet werken.
kemphaas schreef op maandag 07 november 2005 @ 14:15:
Dankje, ik zal het eens invoeren in een C++ progje en kijken.
"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein
Weet ik hoe je zo'n ding noemt. Iets wat ervoor zorgt dat de code ook echt een programma wordt.
Werk hard als je tijd hebt, dan heb je tijd als je hard moet werken.
Een compilerkemphaas schreef op maandag 07 november 2005 @ 14:23:
Weet ik hoe je zo'n ding noemt. Iets wat ervoor zorgt dat de code ook echt een programma wordt.
Waarom koop je niet gewoon een simpel boek over programmeren. Leer je wellicht meteen iets over verschillende talen, iets over compilers, assemblers, over interpreters en virtual machines e.d.
Altijd goed om met een goeie basis te beginnen.
"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein
Is idd wel een goed idee, ik wil sowieso wel meer erover leren, dus misschien is een boek erover niet zo'n slecht idee.Exirion schreef op maandag 07 november 2005 @ 14:24:
[...]
Een compiler
Waarom koop je niet gewoon een simpel boek over programmeren. Leer je wellicht meteen iets over verschillende talen, iets over compilers, assemblers, over interpreters en virtual machines e.d.
Altijd goed om met een goeie basis te beginnen.
Werk hard als je tijd hebt, dan heb je tijd als je hard moet werken.
Verwijderd
Dat is nu R (www.r-project.com) is hier boven ook al genoemdkemphaas schreef op maandag 07 november 2005 @ 13:49:
[...]
Bedankt voor de code, maar welke taal is het en in welk programma kan ik het invoeren en uit laten voeren?
Heb m ingevoerd in CodeBlocks en er komt idd steeds ongeveer 50% uit. Helemnaal top man, bedankt.curry684 schreef op maandag 07 november 2005 @ 14:07:
Hier heb je de C++ versie:
C++:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 #include <iostream> #include <time.h> using namespace std; // Constants for use in the application const int c_Iterations = 10000; const int c_GroupSize = 23; const int c_DaysInYear = 365; // main: Entry point for the application int main() { int l_Group[c_GroupSize]; int l_Clashes = 0; int l_Index; int l_SubIndex; int l_Iteration; // Randomize srand((unsigned int)time(NULL)); // Repeat for all iterations for(l_Iteration = 0; l_Iteration != c_Iterations; l_Iteration++) { // Fill group with random birthdays for(l_Index = 0; l_Index != c_GroupSize; l_Index++) l_Group[l_Index] = (rand() * c_DaysInYear) / RAND_MAX; // Check for collisions for(l_Index = 0; l_Index < c_GroupSize; l_Index++) for(l_SubIndex = l_Index + 1; l_SubIndex < c_GroupSize; l_SubIndex++) if(l_Group[l_Index] == l_Group[l_SubIndex]) { l_Clashes++; l_Index = c_GroupSize; break; } } // Output results cout << "Clashes: " << l_Clashes << endl; cout << "Hit % : " << (double)l_Clashes * 100 / c_Iterations << endl; cin.get(); return 0; }
Kun je zelf kijken of je het te moeilijk vindC# en Java zijn een tikkie simpeler.
Werk hard als je tijd hebt, dan heb je tijd als je hard moet werken.
Verwijderd
Dit soort dingen zijn moeilijk te begrijpen als je er meteen zo ver in duikt. Ik zou beginnen met een tutorial van "Hoe laat ik mijn programma 'Hello World' zeggen?" In boekvorm is wel aan te raden, maar via internet kan ook.
[ Voor 11% gewijzigd door Verwijderd op 07-11-2005 15:37 ]
Vraagje, als ik de code heb ingevuld, hoe compile ik het geheel dan? Er zit niks van een knop van compile of finish ofzo bij.Verwijderd schreef op maandag 07 november 2005 @ 13:02:
de R code:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13N<-10000 # aantal simulaties pers<-23 #aantal personen data<-1:365 uit<-0 for (i in 1:N) # doe het experiment N maal { trek<-sample(data,pers,replace=TRUE) # trek 'pers' verjaardagen trek1<-outer(trek,trek,"-")-diag(pers) # matrix met alle dagen vergeleken if ( any(trek1==0) ) uit=uit+1/N # check zelfde dag jarig } cat (uit) # uitkomst
Werk hard als je tijd hebt, dan heb je tijd als je hard moet werken.
Heb op mijn rekenmachine veel geprogrammeerd dus kan wel een beetje overweg met zoiets. Het is makkelijker als je het ziet dan het zelf te maken.Verwijderd schreef op maandag 07 november 2005 @ 15:36:
De vraag is nu natuurlijk, snap je wat er precies gebeurt? Wat doen bijvoorbeeld al die {} in het programma, en wat doen die srand, time, rand... wat doet return?
Dit soort dingen zijn moeilijk te begrijpen als je er meteen zo ver in duikt. Ik zou beginnen met een tutorial van "Hoe laat ik mijn programma 'Hello World' zeggen?" In boekvorm is wel aan te raden, maar via internet kan ook.
Werk hard als je tijd hebt, dan heb je tijd als je hard moet werken.
Daarom leer je er zo ook niks van. Stel simpele doelen en ga steeds een stukje verder. Van klakkeloos kopieren is nog nooit iemand wijzer geworden.kemphaas schreef op maandag 07 november 2005 @ 15:47:
Het is makkelijker als je het ziet dan het zelf te maken.
"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein
Weet ik, maar daarom moest ik eerst weten welke taal ik beter wil gaan leren, en nu ik heb gezien dat het werkt, wil ik er meer van weten en het zelf gaan leren.Exirion schreef op maandag 07 november 2005 @ 15:48:
[...]
Daarom leer je er zo ook niks van. Stel simpele doelen en ga steeds een stukje verder. Van klakkeloos kopieren is nog nooit iemand wijzer geworden.
Werk hard als je tijd hebt, dan heb je tijd als je hard moet werken.
Ik geef normaal ook geen kant-en-klare codeExirion schreef op maandag 07 november 2005 @ 15:48:
[...]
Daarom leer je er zo ook niks van. Stel simpele doelen en ga steeds een stukje verder. Van klakkeloos kopieren is nog nooit iemand wijzer geworden.
Verwijderd
Start Rkemphaas schreef op maandag 07 november 2005 @ 15:36:
[...]
Vraagje, als ik de code heb ingevuld, hoe compile ik het geheel dan? Er zit niks van een knop van compile of finish ofzo bij.
->File -> New script
copy past het script in je scriptwindow.
selecteer het
klik de button Run Line or selection (3 icoon, naast save)
en zie de output in de console.
Hoe nou uit te maken wat er gebeurt?
Haal de for loop weg (inclusief {}) en run het script nog een keer
typ nu de namen in van de variabelen (trek, trek1) etc om te zien wat daar in staat. Zoek in de manual van R op wat de bepaalde functies doen: typ ?naam, bv ?any
Je krijgt dan uitleg wat er gebeurt.
Verwijderd
Haskell is ook al gezegd. Persoonlijk zou ik voor Clean kiezen. Syntactisch bijna hetzelfde maar eigenlijk toch veel eliganter en het compiled efficienter. Door de handige recursie (wat veel slimmer wordt gecompiled dan in C++) kun je hele krachtige maar ogenschijnlijk simpele dingen doen. Maar om één of andere reden denk ik toch niet dat je daar naar op zoek bent. Pak gewoon C++, of Java. Java is wel iets makkelijker om te leren. Alles wat niet perse hoeft, kan simpelweg niet. En toch kun je er uiteindelijk precies hetzelfde mee bereiken als met C++.
Ga er verder maar van uit dat je in elke programmeertaal vrij snel simpele berekeningen kunt laten uitvoeren. Zou anders geen goede programmeertaal zijn
[ Voor 9% gewijzigd door Verwijderd op 07-11-2005 16:55 ]
Ter vergelijking heb ik dit voorbeeld even omgeschreven naar Delphi. Je zou deze code eigenlijk zonder meer in iedere andere Pascalcompiler kunnen gebruiken. Het is aardig om de C++ versie en de Delphiversie te vergelijken. Afgezien van het feit dat ik de iteratie in een aparte procedure heb gezet (dat werkt in dit geval wat handiger in Delphi) is de code vrijwel exact gelijk. De syntaxis is anders, maar de constantes, variabelen en alle programmastappen zijn gelijk. In C++ is de code wat compacter, in Delphi is de code wat gemakkelijker leesbaar. Qua performance zal er geen meetbaar verschil zijn.curry684 schreef op maandag 07 november 2005 @ 14:07:
Hier heb je de C++ versie:
[...]
Kun je zelf kijken of je het te moeilijk vindC# en Java zijn een tikkie simpeler.
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| program BirthdayParadox; {$APPTYPE CONSOLE} // Global constants and variables for use in the application const Iterations = 10000; GroupSize = 23; DaysInYear = 365; var Group: array[1..GroupSize] of Integer; Clashes: Integer = 0; Iteration: Integer; // IterateOnce is called once for every iteration procedure IterateOnce; var Index, SubIndex: Integer; begin // Fill group with random birthdays for Index := 1 to GroupSize do Group[Index] := Random(DaysInYear); // Check for collisions for Index := 1 to GroupSize do for SubIndex := Index + 1 to GroupSize do if Group[Index] = Group[SubIndex] then begin Clashes := Clashes + 1; Exit; end; end; // Entry point for the application begin Randomize; // Repeat for all iterations for Iteration := 1 to Iterations do IterateOnce; // Output results WriteLn('Clashes: ', Clashes); WriteLn('Hit %: ', Clashes * 100 div Iterations); ReadLn; end. |
[ Voor 17% gewijzigd door Tomatoman op 07-11-2005 17:13 ]
Een goede grap mag vrienden kosten.
Je moet voor de editor alleen nog de Wordstar commands in je hoofd hebben
For it is the doom of men that they forget... Huidige en vroegere hardware specs The Z80 is still alive!
Kijk even naar de code hier direct boven. Waarschijnlijk kun je dat met Turbo Pascal compileren. Het enige verschil is dat Turbo Pascal een 16-bits DOS-applicatie oplevert, terwijl Delphi een 32-bits Windowsapplicatie bouwt (het is een console-applicatie, maar zeker geen DOS). Bestandsgrootte: 16.384 bytes.EXX schreef op maandag 07 november 2005 @ 17:09:
Niet lachen, maar voor simpele progsels gebruik ik nog steeds Turbo Pascal V3.0. Ja, dat is DOS en ja, geen IDE of GUI. Maar wel supereenvoudig. Alles-in-een: geen installatie en includen/linken van allerlei libraries. Progseltje maken, compileren en runnen.
Een goede grap mag vrienden kosten.
Verwijderd
Ik gebruik 9 regels, die ik zou kunnen terugbrengen naar 6 statements.
Zowel de c++ als de Delphi versie zien er toch een stuk complexer uit. Uiteraard zijn die talen sneller als het gaat om zeer grote datasets, of miljarden berekeningen, maar de taal R is precies geschreven om dit soort dingen te doen op een simpele manier.
Na wat kleine wijzigingen loopt het idd ook met Turbo Pascal 3.0. Als je compileert naar een executable krijg je overigens een .COM file van 11,754 bytes.tomatoman schreef op maandag 07 november 2005 @ 17:19:
[...]
Kijk even naar de code hier direct boven. Waarschijnlijk kun je dat met Turbo Pascal compileren. Het enige verschil is dat Turbo Pascal een 16-bits DOS-applicatie oplevert, terwijl Delphi een 32-bits Windowsapplicatie bouwt (het is een console-applicatie, maar zeker geen DOS). Bestandsgrootte: 16.384 bytes.
For it is the doom of men that they forget... Huidige en vroegere hardware specs The Z80 is still alive!
Het aantal regels code is niet maatgevend. Vaak is het duidelijker als je wat meer regels gebruikt. Dat neemt niet weg dat jouw code in R er interessant uitziet. Ik neem graag van je aan dat R in dit geval een uitstekende taalkeuze is. De hoeveelheid rekenwerk is voor een moderne processor peanuts, zelfs een scripttaal zou hier geen problemen mee mogen hebben. Het grote nadeel dat R mijns inziens heeft, is dat het een nogal obscuur bestaan leidt. Ik denk niet dat er veel gebruikers in dit forum zijn die er ooit van hebben gehoord. Daarom: vooral geschikt voor gevorderde programmeurs.Verwijderd schreef op maandag 07 november 2005 @ 17:43:
Ik geloof dat R toch de meest simpele code heeft voor de birthday paradox. (zie boven)
Ik gebruik 9 regels, die ik zou kunnen terugbrengen naar 6 statements.
Zowel de c++ als de Delphi versie zien er toch een stuk complexer uit. Uiteraard zijn die talen sneller als het gaat om zeer grote datasets, of miljarden berekeningen, maar de taal R is precies geschreven om dit soort dingen te doen op een simpele manier.
Jouw programmeervoorbeeld lijkt me geen compleet programma. Ik zie nergens output naar het scherm gaan. Het complete programma zal daarom een paar regels langer zijn.
Nu we toch bezig zijn: is er misschien iemand die het programmeervoorbeeld zou willen omzetten naar Java, Visual Basic, C# of Cobol? Dan hebben we de meestgebruikte oude en nieuwe programmeertalen naast elkaar staan. Lijkt me wel interessant, vooral omdat het hier om een real-life voorbeeld gaat.
Een goede grap mag vrienden kosten.
Verwijderd
De bottom line is dat je het voorbeeldprobleem van de topicstarter met zeer weinig moeite en programmeerkennis kunt omzetten in een werkend programmaatje. Het gaat er niet om welke taal de beste is, het gaat er juist om dat in dit geval iedere genoemde taal geschikt is. De syntaxis verschilt, maar verder lijkt het allemaal ontzettend veel op elkaar.
Een goede grap mag vrienden kosten.
Worden de allersimpelste operaties in alle talen niet naar precies dezelfde machinecode geoptimaliseerd? Ik zou het niet vreemd vinden als een miljoen optellingen, afgezien van de overhead, in bijvoorbeeld Python niet meer tijd kost dan in C?curry684 schreef op maandag 07 november 2005 @ 13:51:
Hoezo dat? Een simpele berekening voor de statistiek 1 miljoen keer uitvoeren zal in C/C++ merkbaar sneller gaan dan in VB6. Your point being?
Wie trösten wir uns, die Mörder aller Mörder?
Het is iig veel en veel en veel makkelijker dan c of java, geen belachelijke verklaringen en includes en andere bullshit aan het begin van je file enzo... Ik had na 2 uurtje leren al een command line hoger lager spelletje gemaakt.
Werk hard als je tijd hebt, dan heb je tijd als je hard moet werken.
En er is ook een erg goed, gratis boek beschikbaar: Programming Ruby. Je kan dan altijd overstappen naar talen als Java/C++/C#/C enz. Je kan in principe met alles wel beginnen: met Ruby zul je sneller hele programma's kunnen schrijven, maar als je later voor snelheid wil gaan moet je vaak in b.v. c++ gaan schrijven, dan wordt er stukken meer van je verwacht als programmeur (lees: het is (meestal) een stuk moeilijker), maar je krijgt er wel een enorme performancewinst voor terug. Als je juist begint te leren in C++ leer je een stuk beter wat er allemaal bij programmeren komt kijken, schrijf je snellere programma's, maar ik denk dat het (in het begin) iets langer zal duren voordat je een programma zal maken.
Maar dus, Ruby!
Een goede grap mag vrienden kosten.
Verwijderd
[ Voor 17% gewijzigd door Verwijderd op 07-11-2005 20:21 ]
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
| uses Windows; ... var Time: LongWord; // Entry point for the application begin Randomize; Time := GetTickCount; // Repeat for all iterations for Iteration := 1 to Iterations do IterateOnce; Time := GetTickCount - Time; // Output results WriteLn('Clashes: ', Clashes); WriteLn('Hit %: ', Clashes * 100 div Iterations); WriteLn(Iterations, ' iterations performed in ', Time, ' ms'); ReadLn; end. |

Maar we gaan nu wel erg off-topic.
[ Voor 28% gewijzigd door Tomatoman op 08-11-2005 23:23 ]
Een goede grap mag vrienden kosten.
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| import java.util.Random; public class birthdayParadox { //Constants for use in the application public static int c_Iterations = 10000; public static int c_GroupSize = 23; public static int c_DaysInYear = 365; public static void main(String[] args) { int[] l_Group = new int[c_GroupSize]; int l_Clashes = 0; int l_Index; int l_SubIndex; int l_Iteration; // Randomize Random generator = new Random(); // Repeat for all iterations for (l_Iteration = 0; l_Iteration != c_Iterations; l_Iteration++) { // Fill group with random birthdays for (l_Index = 0; l_Index != c_GroupSize; l_Index++) { l_Group[l_Index] = (generator.nextInt(c_DaysInYear)); } // Check for collisions for (l_Index = 0; l_Index < c_GroupSize; l_Index++) { for (l_SubIndex = l_Index + 1; l_SubIndex < c_GroupSize; l_SubIndex++) { if (l_Group[l_Index] == l_Group[l_SubIndex]) { l_Clashes++; l_Index = c_GroupSize; break; } } } } // Output results System.out.println("Clashes: " + l_Clashes); System.out.println("Hit % : " + (double) l_Clashes * 100 / c_Iterations); } } |
In JBuilder gecompiled, gaf dit onder andere deze resultaten:
Clashes: 5156
Hit % : 51.56
Clashes: 5055
Hit % : 50.55
Clashes: 5046
Hit % : 50.46
Clashes: 5091
Hit % : 50.91
Benchmark gaf tussen de 50 en 100 ms aan.
[ Voor 3% gewijzigd door blizt op 07-11-2005 21:57 . Reden: Informatie van benchmark toegevoegd. ]
United we stand, and divided we fall
Dan had je een debugbuild voor C++kemphaas schreef op maandag 07 november 2005 @ 19:53:
Ik heb R en C++ eens ingevoerd en vergeleken. R ziet er duidelijk makkelijker uit dan C++, maar om 1 miljoen simulaties te doen had R 4 minuten en 33 seconden nodig, en C++ had hiervoor maar 5 seconden nodig. Hier zit dus echt wel wat verschil in, maar de 50% klopt iig.
Ik zie overigens geen codewar hier, ik vind het eigenlijk wel een keer leuk en informatief om hetzelfde probleem in tig talen op te lossen
In debugbuild doet mijn Pentium-M 1.86Ghz over 10 miljoen iteraties overigens 12.5 seconde, tegenover 9 seconden in release. Scheelt relatief weinig in dit geval.
Men vroeg btw de C# versie:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| using System; namespace ConsoleTestCsharp { /// <summary> /// Summary description for Class1. /// </summary> class main { // Constants for use in the application private const int c_Iterations = 10000000; private const int c_GroupSize = 23; private const int c_DaysInYear = 365; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { DateTime l_Time = DateTime.Now; Random l_Random = new Random(); int[] l_Group = new int[c_GroupSize]; int l_Clashes = 0; int l_Index; int l_SubIndex; int l_Iteration; // Repeat for all iterations for(l_Iteration = 0; l_Iteration != c_Iterations; l_Iteration++) { // Fill group with random birthdays for(l_Index = 0; l_Index != c_GroupSize; l_Index++) l_Group[l_Index] = l_Random.Next(c_DaysInYear); // Check for collisions for(l_Index = 0; l_Index < c_GroupSize; l_Index++) for(l_SubIndex = l_Index + 1; l_SubIndex < c_GroupSize; l_SubIndex++) if(l_Group[l_Index] == l_Group[l_SubIndex]) { l_Clashes++; l_Index = c_GroupSize; break; } } // Output results Console.WriteLine("Clashes : {0}", l_Clashes); Console.WriteLine("Hit % : {0}", l_Clashes * 100 / c_Iterations); Console.WriteLine("Time : {0}", DateTime.Now - l_Time); Console.ReadLine(); } } } |
23.5 seconde
[ Voor 62% gewijzigd door curry684 op 07-11-2005 23:27 ]
Anyway, voor het vergelijk in PHP:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| <?php function getmicrotime() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } // Start benchmark $start = getmicrotime(); // Constants for use in the application $c_Iterations = 10000; $c_GroupSize = 23; $c_DaysInYear = 365; // Clash counter $clashes = 0; // Repeat for all iterations for($i=0; $i != $c_Iterations; $i++) { $a_Group = array(); // Fill group with birthdays until a duplicate birthday is found for($j=0; $j != $c_GroupSize; $j++) { $birthday = rand(1,$c_DaysInYear); // Collision check if (!in_array($birthday, $a_Group)) { $a_Group[] = $birthday; } else { $clashes++; break; } } } // Benchmark time $timePassed = getmicrotime() - $start; // Output results echo 'Clashes: ' .$clashes ."\n"; echo 'Hit % : ' .$clashes * 100 / $c_Iterations ."\n"; echo 'Time : ' .$timePassed .'s' ."\n"; ?> |
Bevat een optimalisatie door tijdens het vullen van de groep al te checken of de verjaardag bestaat. Dat scheelt de helft in executietijd ten opzichte van het eerder geposte algorithme in C++ maar zorgt nog altijd voor ~2.3s op een PIII 800 bij 10.000 iteraties.
Regeren is vooruitschuiven
Wat je zegt van parameters veranderen, kun je natuurlijk oplossen met 'n simpel inputdingetje lijkt me? Sowieso, als je een IDE hebt die de output gelijk laat zien na het compilen .. en de compiletijd is lager dan de executiontijd van je PHPscript ... ben je alsnog sneller uit toch?
United we stand, and divided we fall
Verwijderd
Ik zit op het mbo ICT niv.3
Naast HTML leer ik nu Javascript
Is dit nou een taal waar je wat mee kan, want zoals mij wordt vertelt schijnt het erg goed te zijn voor kleine berekeningen.
Ik heb nog nergens java script zien langskomen.
Ik zie wel vaak Java voor bijkomen, maar neem aan dat jullie echt JAVA bedoelen en niet Java sc. wat als ik het goed begrijpt iets heel anders is
[ Voor 10% gewijzigd door Verwijderd op 08-11-2005 01:06 ]
Javascript wordt met name clientside in webbrowsers gebruikt, en is als zodanig niet echt geschikt als standalone programmeertaal: je hebt er vrijwel altijd een serverside component als PHP of ASP.NET bij nodig.
Dat wil niet zeggen dat het geen krachtige taal is overigens, onze eigen crisp wordt wereldwijd als Javascript-god gezien wegens het implementeren van Lemmings in Javascript: klik
In principe kun je een hele boel met javascript oplossen. Het is echter ontwikkeld voor het gebruik in websites. Vergeleken met een echte programmeertaal ben je daardoor beperkt in de mogelijkheden. Bovendien is het niet erg snel als het gaat om heel veel kleine berekeningen zoals in dit topic. Het ligt dus niet erg voor de hand om javascript te kiezen om de birthday paradox te simuleren. Daar zijn betere middelen voor voorhanden.Verwijderd schreef op dinsdag 08 november 2005 @ 01:05:
Naast HTML leer ik nu Javascript
Is dit nou een taal waar je wat mee kan, want zoals mij wordt vertelt schijnt het erg goed te zijn voor kleine berekeningen.
Naast het feit dat JS niet erg geschikt is voor het oplossen voor het probleem valt de taal onder de client-side scriptingtalen. Die vallen onder het Webdesign en Graphics forum en zul je dus niet tegenkomen in Programming en Webscripting (dat is althans de bedoeling). Maar aangezien je javascript aan het leren bent, waarom probeer je niet zelf het algorithme in JS te implementeren? Als je de code in deze post bestudeerd dan heb je als het goed is al een redelijke aanwijzing hoe het zou kunnen. Let wel op dat je niet gelijk met 10.000 herhalingen begint, dat zou wel eens erg lang kunnen duren...Ik heb nog nergens java script zien langskomen.
Regeren is vooruitschuiven
Verwijderd
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
| program birthday
implicit none
integer::sim=1000000
integer,parameter::pers=23
real,dimension(pers)::dag
real,dimension(pers,pers)::help,help1
integer::i
real::uit
do i=1,pers
help1(i,i)=1
enddo
do i=1,sim
call random_number (dag)
help=spread(int(dag*365+1),dim=2,ncopies=size(dag))-spread(int(dag*365+1),dim=1,ncopies=size(dag))-help1
if (ANY(help .eq. 0)) uit=uit+1/real(sim)
enddo
write (*,*) uit
read (*,*)
end program birthday |
6 sec op een 1700 MHz Athlon
Verwijderd
R wordt momenteel erg veel gebruikt door statistici als simulatie & plot programma.tomatoman schreef op maandag 07 november 2005 @ 18:09:
[...]
Het grote nadeel dat R mijns inziens heeft, is dat het een nogal obscuur bestaan leidt. Ik denk niet dat er veel gebruikers in dit forum zijn die er ooit van hebben gehoord.
offtopic:
Jouw programmeervoorbeeld lijkt me geen compleet programma. Ik zie nergens output naar het scherm gaan. Het complete programma zal daarom een paar regels langer zijn.
De output van het programma wordt naar het scherm gescreven met de obscure opdracht 'cat'.
Verwijderd
Als ik echter een model moet simuleren kom ik weer uit op goed old C++. Gaat meestal beduidend sneller dan bv R en meer dan wat random trekken uit (niet altijd normale) verdelingen zit er bij mij toch niet in. De statieken komen dan weer mooi uit Eviews (of soms Excel)
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
| #!/usr/bin/ruby iterations = 10000 group_size = 23 days_in_year = 365 hits = 0.0 iterations.times do group = Array.new for i in 0..(group_size-1) group[i] = rand(days_in_year) end for i in 0..(group_size-1) for j in (i+1)..(group_size-1) if(group[i]==group[j]) then hits = hits + 1 end end end end print "Hits: ", hits, "\n" print "Iterations: ", iterations, "\n" print "Hits / Iterations: ", (hits / iterations), "\n" |
Verwijderd
in jouw C++ versie zie ik 2 keer dezelfde for loop:
1
2
3
4
5
| // loop 1 for(l_Index = 0; l_Index != c_GroupSize; l_Index++) //loop 2 for(l_Index = 0; l_Index < c_GroupSize; l_Index++) |
De uitwerking van die loop is ongeveer hetzelfde, maar de eerste keer gebruik je != om uit je loop te kunnen springen, en de tweede keer gebruik je <. Waarom?
/offtopic
[ Voor 3% gewijzigd door curry684 op 08-11-2005 15:00 ]
[ Voor 77% gewijzigd door .oisyn op 08-11-2005 15:11 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Verwijderd
Ok, duidelijk. Maar waarom gebruik je in die eerste loop dan != ipv <?curry684 schreef op dinsdag 08 november 2005 @ 15:00:
De 2e zou anders failen omdat ik 'm gebruik om uit de inner loop te jumpen. Kijk nog maar eens goed
Ik heb tijdens mijn lessen java altijd geleerd om < te gebruiken, omdat het veiliger is. (bij != kun je makkelijker over de stop conditie heen springen) Het viel mij ook al op dat in het boek C++ primer - fourth edition ook altijd != wordt gebruikt. Mijn vraag is dus eigenlijk: waarom zou je != gebruiken als je ook met < kunt werken?
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Verwijderd
Komt niet verder dan een t-toets? Een kleine greep:Verwijderd schreef op dinsdag 08 november 2005 @ 13:49:
Als ik statistische rommel moet doen gebruik ik eigenlijk steevast eviews. Maar goed, dat is meer een statistisch pakket waarin je ook nog wat kan scripten dan een echte programmeertaal. Maar wel stukken uitgebreider dan R wat net een t-toets of f-toets standaard ondersteund.
http://cran.au.r-project.org/src/contrib/PACKAGES.html
enne...nofi maar niet blaten over zaken waar je geen verstand van hebt.
Verwijderd
Pascal is toch min of meer genoemd.... als je even terug kijkt dan zie je dat Delphi genoemd is. De laatste keer dat ik in Delphi geprogrammeerd heb was de syntax nog steeds hetzelfde als in pascal.frickY schreef op maandag 07 november 2005 @ 12:34:
Waarom noemt niemand de taal Pascal?
Dat is prima geschikt voo rdergelijke mogelijkheden in een command prompt.
O ja.... niet vergeten te melden dat ik denk dat Delphi waarschijnlijk wel iets voor je is.
[ Voor 11% gewijzigd door Verwijderd op 08-11-2005 16:55 ]
Verwijderd
Even voor de duidelijkheid. Als je bijvoorbeeld op zoek bent naar een simpele Durbin Watson test kun je lang zoeken. Zal vast wel in één van die modules zitten maar in welke?
Zelfde voor bv het testen op normaliteit. Gaat leuk als je de complete distributie hebt Kolmogorov-Smirnov, Lilliefors, Cramer-von Mises, Anderson-Darling ze staan er allemaal tussen. Maar als ik nu even mijn residuen wil testen? Welke module moet ik dan hebben? Waar o waar zit bv de Jarque-Bera test?
En zo kan ik nog wel even doorgaan. De basis komt niet verder dan een t-toets of f-toets. De rest is van diverse kwaliteit en een hoop basiszaken zijn lastig tot niet te vinden. Waar kan ik bv tests vinden die met ARCH of GARCH te maken hebben? Zoeken op ARCH levert geen resultaten. Zoeken op Heteroscedasticiteit 1 niet relevant resultaat.
De genoemde zaken zijn allemaal vrij basic maar allemaal "optional" en lastig te vinden in R.
Zodra de documentatie en kwaliteit van de algoritmes zich met de bekende commerciele pakketten kunnen meten wordt R zéér interessant. Maar voorlopig is het voor toegepaste statistiek gewoon nog niet daar. Te traag voor simulaties en te beperkt en te onhandig voor evaluaties. En als ik dan toch zelf moet gaan implementeren kies ik toch echt voor C++ of Java. Anderen misschien voor pascal of VB maar voorlopig heb ik nog geen één serieus model in R gezien.
Verwijderd
Eerste link: http://cran.r-project.org...worth-EconometricsInR.pdf
Kijk eens wat daar allemaal staat. En wat noem jij een serieus model?
[ Voor 46% gewijzigd door Verwijderd op 08-11-2005 17:57 ]
Verwijderd
In andere woorden... offtopic.
Omdat ik gewend ben != te gebruiken tenzij ik een goede reden heb om dat niet te doen zoals in het 2e geval. No other particular reasonVerwijderd schreef op dinsdag 08 november 2005 @ 15:16:
[...]
Ok, duidelijk. Maar waarom gebruik je in die eerste loop dan != ipv <?
Ik heb tijdens mijn lessen java altijd geleerd om < te gebruiken, omdat het veiliger is. (bij != kun je makkelijker over de stop conditie heen springen) Het viel mij ook al op dat in het boek C++ primer - fourth edition ook altijd != wordt gebruikt. Mijn vraag is dus eigenlijk: waarom zou je != gebruiken als je ook met < kunt werken?
Je kunt images van je rekenmachine op je PC uitvoeren. Je draait dan je rekenmachine software op je PC, die natuurlijk veel sneller rekend. Zo kun je heel snel veel berekeningen uitvoeren, heb ik ooit eens gebruikt omdat die rekenmachine me te lang duurde... is alweer tijdje terug wel.
Overigens, volgens mij mag je die images neit zomaar gebruiken (copyrighted) maar als je de rekenmachine hebt zal dat wel anders liggen, ik weet het niet precies.
Kijk maar eens naar eerste hit: http://www.google.nl/sear...en&q=ti+83+emulator&meta=
Ondernemer in tech (oud LOQED.com, nu UpToMore.com)

[edit]
Uiteraard geen macro's gebruikt, alles wordt gewoon met wat formules berekend. Hoewel het allemaal min of meer voor zich spreekt, zal ik de spreadsheet kort uitleggen. Er zijn in feite maar 3 formules. De formule die in elk van de 3 gekleurde cellen wordt gebruikt, heb ik ter verduidelijking onderaan de spreadsheet nog eens als tekst weergegeven. De formule in C5 is precies gelijk aan de formule in bijvoorbeeld C6, D5 en P1000. De formule in Z6 is gelijk aan de formule in Z5, zij het dat de rijverwijzing dan is gewijzigd in C6:Y6.
[ Voor 62% gewijzigd door Tomatoman op 09-11-2005 00:35 ]
Een goede grap mag vrienden kosten.
Verwijderd
Een model wat geld oplevert. Dat noem ik een serieus model.Verwijderd schreef op dinsdag 08 november 2005 @ 17:55:
zoek in Google: durbin watson r language
Eerste link: http://cran.r-project.org...worth-EconometricsInR.pdf
Kijk eens wat daar allemaal staat. En wat noem jij een serieus model?
Kijk trouwens eens naar de link. Als ik econometrische informatie wil verwerken heb ik nodig. (En in mijn ogen mist hier nog wel wat)
Het R basispakket en de volgende bibliotheken
car Regression tests and robust standard errors
sem Two stage least squares
MASS Robust regression, ordered logit/probit
lmtest Breusch-Pagan and Breusch-Godfrey tests
sandwich (and zoo) Heteroskedasticity and autocorrelation robust covariance
tseries Garch, ARIMA, and other time series functions
MNP Multinomial probit via MCMC
Hmisc LATEX export
xtable Alternative LATEX export
systemfit SUR and 2SLS on systems of equations
fracdiff Fractionally integrated ARIMA models
survival Tobit and censored regression
nlme Nonlinear fixed and random effects models
nnet Multinomial logit/probit
ts* Time series manipulation functions
nls* Nonlinear least squares
foreign* Loading and saving data from other programs
zoo required in order to have the sandwich package
Leuk. Zonder deze modules is R dus ongeschikt. Ook kan ik een aantal bibliotheken downloaden voor C++ (of java of VB of ....) en dan krijg ik precies dezelfde functionaliteit. Wat is dan de meerwaarde om een andere (trage) programmeertaal te leren. Een mooiere for loop?
Als ik een toets wil uitvoeren, wil ik het testen. Niet eerst op zoek gaan naar een implementatie van die toets dan de implementatie controleren en pas daarna de toets gebruiken. Voor dat soort zaken zijn IMHO de bekende statistische pakketten dan ook veel geschikter. Wil ik echter een model maken, heb ik de meeste van die toetsen niet nodig. Wél heb ik een betrouwbare manier nodig om uit verschillende verdelingen te trekken. Dat kan in R. Maar dat kan ook in C++ (Java, VB, ..) Belangrijk is dan wat ik ermee doe. En bv een binoniale boom bouwen gaat in die talen prima. In R?
R lijkt mij dan ook een perfecte script taal voor gebruik in een Open Source statistisch pakket. Er zijn een hoop basisfuncties aanwezig en door goede modules te integreren en gelijk mee te leveren komt er een hoop functionaliteit beschikbaar. Tot slot is de R taal redelijk simpel. Met een goede GUI kan R de concurrentie met de bestaande statistische pakketten waarschijnlijk wel aan, mits de missende functionaliteit aangevuld wordt en de bestaande modules beter geintegreerd worden in het standaard paket.
Echter om C++ en consorten te verslaan is er iets anders nodig: snelheid. En dat is er niet. Functionaliteit dan? Ook niet, ook voor de bekende talen zijn er goede statistische bibliotheken beschikbaar. De meerwaarde van R is dus redelijk beperkt en zit hem niet in het basispakket maar in de extra modules. Deze modules zijn echter ook weer niet zoveel verder ontwikkeld als de beschikbare modules in andere talen. Ook zijn mensen die echt de cutting edge nodig hebben zeker in staat hun eigen model ook in C++ te ontwikkelen. R biedt dan ook IMHO geen echte voordelen boven een standaard taal en is leuk maar (alweer) IMHO een verspilling van tijd. Maak die modules beschikbaar in C++ en je hebt alles wat R je biedt + de voordelen van een bekende, algemeen bruikbare taal. R is te beperkt om algemeen bruikbaar te zijn en ook niet specialistisch genoeg om echt een meerwaarde te hebben voor statistici. Misschien over 5 jaar. Maar daar heeft de TS niets aan
En even voor Remco56. Is R een bruikbare taal voor dit soort zaken: Ja. Is R de taal die je zou moeten leren als je in dit soort zaken geinteresseerd bent: (IMHO) Nee.
Ik vond het eerst ook raar. Maar een reden kan zijn ( in C++ ) met iterators werkt. Iterators moet je in een for loop vergelijken met != omdat ze niet gegarandeerd opeenvolgend zijn (theoretisch). Simpele lussen ed worden iha altijd met < geschrevenVerwijderd schreef op dinsdag 08 november 2005 @ 15:16:
Ok, duidelijk. Maar waarom gebruik je in die eerste loop dan != ipv <?
Ik heb tijdens mijn lessen java altijd geleerd om < te gebruiken, omdat het veiliger is. (bij != kun je makkelijker over de stop conditie heen springen) Het viel mij ook al op dat in het boek C++ primer - fourth edition ook altijd != wordt gebruikt. Mijn vraag is dus eigenlijk: waarom zou je != gebruiken als je ook met < kunt werken?
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Verwijderd
Een mooi betoog!
Oi, bedrijven staan niet bekend om hun interesse in goede modellen, maar eerder om een zo efficient mogelijke afweging van kosten vs. modelcomplexiteit.Een model wat geld oplevert. Dat noem ik een serieus model.
Uiteraard, alleen je zei dat je niets kon vinden over simpele econometrische modellen in R, en ik gaf je de eerste link in Google.Kijk trouwens eens naar de link. Als ik econometrische informatie wil verwerken heb ik nodig. (En in mijn ogen mist hier nog wel wat)
Uiteraard, standaard statistische technieken zijn in veel talen geimplementeerd. Echter, bedenk wel dat 1) je er veel voor moet betalen 2) de source niet wordt vrijgegeven, zodat je niet op fouten kunt checken 3) je voor elke wissewasje en upgrade nogmaals fijn mag betalen. 4) bovendien in commerciele pakketten ontbreken vaak commercieel oninteressante klassen van modellen die wel belangrijk zijn (denk bv aan IRT modellen).Het R basispakket en de volgende bibliotheken
..
Leuk. Zonder deze modules is R dus ongeschikt. Ook kan ik een aantal bibliotheken downloaden voor C++ (of java of VB of ....) en dan krijg ik precies dezelfde functionaliteit. Wat is dan de meerwaarde om een andere (trage) programmeertaal te leren. Een mooiere for loop?
Achter elke model in R zit een wetenschappelijke publicatie. Die zoek je op, en je kunt de software implementatie controleren. Commerciele pakketten bieden deze faciliteit vaak niet. De documentatie is beroerd, en als je ze vraagt naar de gebruikte algoritmen, krijg je een non-sense antwoord dat het bedriijfsgeheim is.Als ik een toets wil uitvoeren, wil ik het testen. Niet eerst op zoek gaan naar een implementatie van die toets dan de implementatie controleren en pas daarna de toets gebruiken. Voor dat soort zaken zijn IMHO de bekende statistische pakketten dan ook veel geschikter.
Wederom, kijk eens op http://cran.au.r-project.org/src/contrib/PACKAGES.html Al die pakketten kun je binnen R zo binnenhalen. Verder, je bent niet'zomaar' geinteresseerd in binomial trees. Een bedrijf heeft een vraag, jij formuleert een antwoord met behulp van wetenschappelijke literatuur. Die verwijzen vaak naar een R pakket. Jij download dat pakket en gaat het gebruiken.Wil ik echter een model maken, heb ik de meeste van die toetsen niet nodig. Wél heb ik een betrouwbare manier nodig om uit verschillende verdelingen te trekken. Dat kan in R. Maar dat kan ook in C++ (Java, VB, ..) Belangrijk is dan wat ik ermee doe. En bv een binoniale boom bouwen gaat in die talen prima. In R?
Een gui is niet nodig voor dergelijk onderzoek. R is oa gebouwd om grafieken te genereren in Latex, iets wat zeer bruikbaar is, en redelijk uniek.R lijkt mij dan ook een perfecte script taal voor gebruik in een Open Source statistisch pakket. Er zijn een hoop basisfuncties aanwezig en door goede modules te integreren en gelijk mee te leveren komt er een hoop functionaliteit beschikbaar. Tot slot is de R taal redelijk simpel. Met een goede GUI kan R de concurrentie met de bestaande statistische pakketten waarschijnlijk wel aan, mits de missende functionaliteit aangevuld wordt en de bestaande modules beter geintegreerd worden in het standaard paket.
Missende functionaliteit? Het is makkelijker schieten op iets, dan te construeren. Maar waar zitten in bv Eviews implementaties van 'serieuze' Bayesiaanse modellen? Waar zit in Eviews de mogelijkheid om ongelijkheidsgerestricteerde modellen te schatten? Waar zijn de SEM modellen, waar zijn de IRT modellen, waar zijn de complexe steekproef technieken? Waar zijn de multiple impuatie technieken?
R is niet bijzonder snel, en dat komt omdat het een geinterpreteerde taal is. R is wel de taal waarin de cutting edge applicaties worden ontwikkeld. Kijk eens naar artikelen in JASA, RSS, Comp Stat, JSR. Ik ken maar weinig auteurs die een C++ implementatie van hun modellen maken, maar ik ken er zat die in R werken. Deze auteurs zijn de ontwikkelaars van de nieuwe statistische technieken. Dat deze technieken later door programmeurs worden omgezet in C++, en worden verkocht voor veel geld, snap ik best, maar het laat we de volgorde van zaken zien.Echter om C++ en consorten te verslaan is er iets anders nodig: snelheid. En dat is er niet. Functionaliteit dan? Ook niet, ook voor de bekende talen zijn er goede statistische bibliotheken beschikbaar. De meerwaarde van R is dus redelijk beperkt en zit hem niet in het basispakket maar in de extra modules. Deze modules zijn echter ook weer niet zoveel verder ontwikkeld als de beschikbare modules in andere talen. Ook zijn mensen die echt de cutting edge nodig hebben zeker in staat hun eigen model ook in C++ te ontwikkelen. R biedt dan ook IMHO geen echte voordelen boven een standaard taal en is leuk maar (alweer) IMHO een verspilling van tijd. Maak die modules beschikbaar in C++ en je hebt alles wat R je biedt + de voordelen van een bekende, algemeen bruikbare taal. R is te beperkt om algemeen bruikbaar te zijn en ook niet specialistisch genoeg om echt een meerwaarde te hebben voor statistici. Misschien over 5 jaar. Maar daar heeft de TS niets aan
R is een zeer simpele taal die uitstekend in staat is vernieuwingen te ondersteunen op het gebied van de statistische wetenschap. In de praktijk blijkt dat voor normale hoeveelheden data R prima geschikt is om velerlei modellen mee te schatten. Uiteraard, als het we het hebben over de implementatie van statistische technieken in een ERP pakket, zal je de toevlucht moeten nemen naar C.
En even voor Kemhaas. Is R een bruikbare taal voor dit soort zaken: Ja. Is R de taal die je zou moeten leren als je echt in dit soort zaken geinteresseerd bent: Ja. Is R een taal als je wilt klikken en mikken in een mooie GUI: nee. [/quote]
Als je deze taal goed gebruikt zullen je programmas waarschijnlijk een heel stuk korter, eleganter en leesbaarder worden dan bij het gebruik van een imperatieve taal.
[ Voor 24% gewijzigd door j-w op 09-11-2005 11:20 ]
Je "vergeet" wel even de lastige leercurve, praktisch onleesbare en ononderhoudbare code (voor 99% van de programmeurs), en de zeer trage executie. Haskell wordt eigenlijk alleen serieus gebruikt binnen de academische wereld, iets wat ook door docenten wordt beaamd. Ik ben met je eens dat de resultaten vaak kort & elegant zijn, maar bruikbaar is het niet.j-w schreef op woensdag 09 november 2005 @ 11:19:
Ik zou voor een functionele taal gaan, bv Haskell, http://www.haskell.org.
Als je deze taal goed gebruikt zullen je programmas waarschijnlijk een heel stuk korter, eleganter en leesbaarder worden dan bij het gebruik van een imperatieve taal.
Voor de volledigheid lijkt het me leerzaam voor de TS als je zijn probleempje even in Haskell implementeert, en de resulterende code hier post.
[ Voor 5% gewijzigd door joepP op 09-11-2005 12:10 ]
En daarom heeft juist die loop dus een < gekregen ipv een !=. Your point being?.oisyn schreef op dinsdag 08 november 2005 @ 15:19:
Sterker nog, het gaat zelfs gruwelijk fout. l_Index wordt op c_GroupSize gezet. Voor dat de conditie in de for gechecked wordt, wordt eerst het increment-gedeelte uitgevoerd. l_Index is dan dus c_GroupSize + 1. In de tweede loop springt ie eruit, maar in de eerste loop in de volgende iteratie wordt gewoon doorgegaan omdat l_Index != c_GroupSize.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Verwijderd
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
33
34
35
36
37
38
39
| @ECHO OFF
set /a num=23
set /a sim=10
set /a res1=0
for /L %%A in (1,1,%sim%) DO set N=%%A & call :proc0
echo %res1% / %sim%
goto :eof
:proc0
echo.
echo sim %N%
set /a res=0
for /L %%P in (1,1,%num%) DO set pers=%%P & call :proc1
set /a check=%num%-1
for /L %%Q in (1,1,%check%) DO set file=%%Q & call :proc2
if %res%==1 set /a res1=%res1%+1
goto :eof
:proc1
set /a r=%random%/90
echo %r%>pers%pers%
goto :eof
:proc2
echo controle pers %file%
FOR /F %%G in ('type pers%file%') DO set contr=%%G
set /a check1=%file%+1
for /L %%S in (%check1%,1,%num%) DO set file1=%%S & call :proc3
goto :eof
:proc3
FOR /F %%H in ('type pers%file1%') DO set contr1=%%H
if %contr%==%contr1% set /a res=%res%+1
if %res%==2 set/a res=1
goto :eof
:eof |
Hij is wel traag
die CMD-versie is bikkel
En ik vond het al stoer dat olav een Fortranversie had gebrouwen
Een goede grap mag vrienden kosten.
Verwijderd
Dank je
Maar ik ben wel bang dat deze discussie enigszins verder gaat dan "simpel" berekeningen. Duidelijk is in ieder geval dat wij een ander uitgangspunt hebben. Aan de andere kant, een discussie waar eens wat dieper op de zaken wordt ingegaan is natuurlijk nooit weg. Al ben ik bang dat we uiteindelijk niet verder komen dan dat we "agree that we disagree". Maar ook dat kan nuttig zijn.
[...]
Dat is absoluut onjuist. Er zijn zat bedrijven die veel geld over hebben voor een goed model. Denk daarbij aan banken maar ook bv aan het KNMI. Als banken via een goed model, aandelenkoersen beter kunnen voorspellen hebben zij daar veel voor over. En dat geld voor meer bedrijven. Toegepaste statistiek is ondertussen een echte bedrijfstak waar veel bedrijven veel geld in investeren. Zo heeft bv KLM veel geld over voor informatie over haar tariefstructuur, de NS voor informatie over haar dienstregeling en Airbus over het gebruik van haar toestellen. En zo kan ik nog wel een tijdje doorgaan. Het is niet voor niets dat vorig jaar een econometrisch bedrijf (waar ik niet aan verbonden ben) de ondernemingsprijs van Rotterdam gewonnen heeft. Goede modellen leveren bedrijven veel geld op. En zij hebben daar dus ook veel geld voor over.Oi, bedrijven staan niet bekend om hun interesse in goede modellen, maar eerder om een zo efficient mogelijke afweging van kosten vs. modelcomplexiteit.
[...]
Mijn punt is meer dat je zodra je iets meer wilt, je aangewezen bent op (een batterij van) extra modules. Ook in andere talen bestaan die modules. Een eerlijke vergelijking vergelijkt dus ofwel R zonder extra modules tegen een andere taal ofwel R met extra modules tegen een andere taal met de beschikbare modules voor die taal. En dan vraag ik me af welke R modules ik zou missen. Erg weinig ben ik bang. Ook ik kan in Google eenvoudig bibliotheken vinden in C++ die hetzelfde doen.Uiteraard, alleen je zei dat je niets kon vinden over simpele econometrische modellen in R, en ik gaf je de eerste link in Google.
Dat die eerste link toevallig veel Econometrische informatie oplevert (waar ik inderdaad in geinteresseerd ben) neemt niet weg dat een hoop informatie niet zomaar te vinden is. Het blijven tenslotte niet door de R ontwikkelaars ondersteunde modules.
[...]
Dat je ervoor moet betalen is niet echt relevant. De kwaliteit en de support kán dat compeseren.Uiteraard, standaard statistische technieken zijn in veel talen geimplementeerd. Echter, bedenk wel dat 1) je er veel voor moet betalen 2) de source niet wordt vrijgegeven, zodat je niet op fouten kunt checken 3) je voor elke wissewasje en upgrade nogmaals fijn mag betalen. 4) bovendien in commerciele pakketten ontbreken vaak commercieel oninteressante klassen van modellen die wel belangrijk zijn (denk bv aan IRT modellen).
De sourcecode is vaak bij statistische biblioteken "gewoon" beschikbaar. Wel is dit inderdaad een belangrijk punt. Zeker als je op de cutting edge van de statistiek werkt.
Betalen voor elk wissewasje en upgrade? Dit is hetzelfde als punt 1
In het vierde punt heb je gelijk. Maar persoonlijk vind ik een klasse modellen die (nog) geen commercieel nut hebben enkel geschikt voor onderzoekers. Voor mensen die modellen voor commercieel gebruik ontwikkelen is dat niet direct een belangrijk punt. iets om in de gaten te houden maar niet iets om gelijk door op een andere taal over te stappen
Daarin is misschien EViews een uitzondering (al ken ik genoeg "vergelijkbare" producten die ook hun implementaties in de help files uitleggen) Vergeet niet dat EViews één van de weinige statistische pakketten is waaraan een nobelprijswinnaar daadwerkelijk heeft geprogrammeerd en ondersteuning levert (Engle) Ook gaat de documentatie vele malen verder dan strict noodzakelijk inclusief verwijzingen naar de wetenschappelijke artikelen waarop de toets gebaseerd is. Persoonlijk vind ik de documentatie van een pakket als EViews béter en vooral consistenter als die van R. De meeste C++ bibliothen daarentegen hebben inderdaad niet die kwaliteit van documentatie.[...]
Achter elke model in R zit een wetenschappelijke publicatie. Die zoek je op, en je kunt de software implementatie controleren. Commerciele pakketten bieden deze faciliteit vaak niet. De documentatie is beroerd, en als je ze vraagt naar de gebruikte algoritmen, krijg je een non-sense antwoord dat het bedriijfsgeheim is.
[...]
Een binomial tree is een basismethode binnen de econometieWederom, kijk eens op http://cran.au.r-project.org/src/contrib/PACKAGES.html Al die pakketten kun je binnen R zo binnenhalen. Verder, je bent niet'zomaar' geinteresseerd in binomial trees. Een bedrijf heeft een vraag, jij formuleert een antwoord met behulp van wetenschappelijke literatuur. Die verwijzen vaak naar een R pakket. Jij download dat pakket en gaat het gebruiken.
Daarnaast geeft dit aan dat als je méér wilt dan enkel de statistische modellen aanroepen, dat je dan al snel tegen de grenzen van R aanloopt. Een universiele taal heeft minder last van dat soort beperkingen
[...]
Allereerst Latex. Ja, een mooie feature maar tegelijkertijd is het toch wel iets wat "verouderd" is. Het kan een hoop maar om je programmeertaal daar afhankelijk van te maken. Ik weet het niet. Persoonlijk vind ik dat ofwel de taal zelf voor grafieken moet kunnen zorgen ofwel de grafieken via meerdere alternatieve pakketten verzorgt moeten kunnen worden.Een gui is niet nodig voor dergelijk onderzoek. R is oa gebouwd om grafieken te genereren in Latex, iets wat zeer bruikbaar is, en redelijk uniek.
Missende functionaliteit? Het is makkelijker schieten op iets, dan te construeren. Maar waar zitten in bv Eviews implementaties van 'serieuze' Bayesiaanse modellen? Waar zit in Eviews de mogelijkheid om ongelijkheidsgerestricteerde modellen te schatten? Waar zijn de SEM modellen, waar zijn de IRT modellen, waar zijn de complexe steekproef technieken? Waar zijn de multiple impuatie technieken?
Daarnaast is EViews inderdaad zeker niet perfect. Eviews richt zich duidelijk op een deelgebied. Namelijk de econometrie. Sommige zaken zijn dan ook niet geimplementeerd of worden als een stiefkind behandeld. Echter EViews heeft ook niet de pretentie om een oplossing voor iedereen te zijn. R heeft dat wel. En waar andere pakketten misschien een beter alternatief zijn voor Eviews voor andere soorten statistiek, is ook R zeker geen universele oplossing. En ik ben realist genoeg om te weten dat R ook nooit een echt universeel pakket kan worden. Ook R heeft zijn sterke en zwakke punten. Probleem is dat de mensen achter R dat (in mijn ogen) te weinig zien. De kracht van R zit hem in de beschikbare modules. Maar als iemand die modules in VB zou implementeren blijft er weinig over van de voordelen van R. De basistaal is dus redelijk beperkt en een combinatie van C++ (of java of vb of....) en een goede bibliotheek heeft dus voor ontwikkelaars weinig tot geen nadelen. Wel kan de documentatie en support ontbreken. Maar R biedt geen garantie dat de documentatie en support wél op een hoog niveau zit.
[...]
Grappig, ik ken dus niemand die echt met R werkt. Wel met talen als C++. VB, Pascal en ken zelfs modellen in Excel. Maar R? Nog niet gezien. Maar ook al liggen de implementaties in andere talen achter op R. Voor hoeveel mensen is dat relevant? De meesten kennen die nieuwe ideeen niet eens en de mensen die het wel kennen hebben waarschijnlijk ook de kennis om het zelf te implementeren.R is niet bijzonder snel, en dat komt omdat het een geinterpreteerde taal is. R is wel de taal waarin de cutting edge applicaties worden ontwikkeld. Kijk eens naar artikelen in JASA, RSS, Comp Stat, JSR. Ik ken maar weinig auteurs die een C++ implementatie van hun modellen maken, maar ik ken er zat die in R werken. Deze auteurs zijn de ontwikkelaars van de nieuwe statistische technieken. Dat deze technieken later door programmeurs worden omgezet in C++, en worden verkocht voor veel geld, snap ik best, maar het laat we de volgorde van zaken zien.
Dat R een simpele taal is en veel vernieuwingen snel ondersteund staat denk ik buiten kijf. Maar voor "simpele berekeningen" vind ik het té specialistisch terwijl voor echt commercieel gebruik het vaak niet geschikt is. Blijft over de onderzoeksmarkt. Maar de meeste mensen die ik ken combineren onderzoek aan een universiteit met een commerciele baan. Als je voor een commerciele opdracht al met commerciele producten (moet) werken is het niet logisch om bij je werk op de universiteit een andere taal te gebruiken.R is een zeer simpele taal die uitstekend in staat is vernieuwingen te ondersteunen op het gebied van de statistische wetenschap. In de praktijk blijkt dat voor normale hoeveelheden data R prima geschikt is om velerlei modellen mee te schatten. Uiteraard, als het we het hebben over de implementatie van statistische technieken in een ERP pakket, zal je de toevlucht moeten nemen naar C.
Ik hoop dan ook al tijden op de implementatie van de beste R modules in C++. Met dezelfde documentatie en kwaliteit als die in R. Dat zou in mijn ogen uiteindelijk het beste zijn.
Snelheid, flexabiliteit én goede modellen in één oplossing vereenigd.
Jij hebt het over modellen die over geld gaan. Dat is ongelijk aan modellen die geld opleveren. Het is al helemaal ongelijk aan modellen die interessant zijn.Verwijderd schreef op woensdag 09 november 2005 @ 02:02:
Een model wat geld oplevert. Dat noem ik een serieus model.
Het grootste deel van de wereld wil andere dingen.Kijk trouwens eens naar de link. Als ik econometrische informatie wil verwerken
Wat een onzin. Alle wetenschappelijke artikelen worden erin geschreven en dat is precies waar je de resultaten voor nodig hebt. R is niet bedoeld voor de financiele wereld met hun, sorry dat ik het zeg hoor, modelletjes. Het Black-Scholes model is niets anders dan een diffusievergelijking met wat gesubstitueerde variabelen. Risico-analyse en koersvoorspellingen... er zijn een hoop interessantere dingen dan dat. Je kan kort of lang ouwehoeren en je statistische kennis tentoonspreiden, maarVerwijderd schreef op vrijdag 11 november 2005 @ 04:24:
Allereerst Latex. Ja, een mooie feature maar tegelijkertijd is het toch wel iets wat "verouderd" is.
sloeg nergens op, als je ziet hoeveel R gebruikt wordt. Het is gewoon totaal uncalled for brutality en ik vraag me af waarom jij het nodig vind zo uit te varen tegen R. Het gewicht dat jij geeft aan enonometrie, hoe interessant ik het persoonlijk ook vind, is niet maatgevend. De bruikbaarheid van R voor financiele toepassingen is ook niet maatgevend voor de waarde ervan.Maar wel stukken uitgebreider dan R wat net een t-toets of f-toets standaard ondersteund.
[ Voor 4% gewijzigd door Confusion op 11-11-2005 09:12 ]
Wie trösten wir uns, die Mörder aller Mörder?
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
33
34
35
36
37
38
39
40
41
| iterations(1000). groupsize(23). go1 :- run(0, 0). %Stoppen als we ver genoeg zijn run(Iteration, Clashes) :- iterations(Max), Max =< Iteration, !, write('Clashes: '), write(Clashes), nl, HitPerc is (Clashes*100)/Max, write('Hit % : '), write(HitPerc), nl. %Loop mechanisme run(Iteration, OldClashes) :- NewIteration = Iteration + 1, iterate(0, [], Clashes), NewClashes is OldClashes + Clashes, run(NewIteration, NewClashes). %Stoppen na een clash iterate(1, _, 1). %Stoppen als we ver genoeg zijn iterate(Clashes, Birthdays, Clashes) :- length(Birthdays, Length), groupsize(Groupsize), Length >= Groupsize, !. %itereren maar! iterate(Clashes, Birthdays, Answer) :- Birthday is random(365), NewBirthdays = [Birthday | Birthdays], birthdayCheck(Birthday, Birthdays, Clashes, NewClashes), iterate(NewClashes, NewBirthdays, Answer). birthdayCheck(Birthday, Birthdays, Clashes, NewClashes) :- member(Birthday, Birthdays), !, NewClashes is Clashes + 1. birthdayCheck(_, _, Clashes, Clashes). |
Het schijnt dat met 10.000 items er opeens vieze floating point errors komen ofzo, maarja
[ Voor 22% gewijzigd door Mithrandir op 11-11-2005 09:38 ]
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| INPUT PROGRAM.
LOOP #I = 1 TO 10000.
do repeat r=v1 to v23.
COMPUTE r = rnd(rv.uniform(0.5,365.5)).
end repeat.
END CASE.
END LOOP.
end file.
END INPUT PROGRAM.
set mxloop = 10000.
matrix.
get m /variables = v1 to v23.
compute m=t(m).
compute ff= make (1,1,0).
loop lus=1 to 10000.
do if (mmax(csum(design(m(:,lus))))>1).
compute ff=ff+1.
end if.
end loop.
print (ff/10000).
end matrix.
exe. |
Uitkomst:
Run MATRIX procedure:
FF/1000000
.5083740000
------ END MATRIX -----
For it is the doom of men that they forget... Huidige en vroegere hardware specs The Z80 is still alive!
Verwijderd
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
| $sim=100
$pers=23
dim $dag[$pers]
dim $i
dim $j
dim $result=0
For $run = 1 To $sim
For $p = 0 To $pers-1
$dag[$p] = Round(Random(0.5, 365.5),0)
Next
$p=0
$i=0
$j=0
For $j=0 To $pers-1
For $p = $j+1 To $pers-1
If $dag[$j]=$dag[$p] Then $i=1
Next
Next
If $i=1 Then $result=$result+1/$sim
Next
MsgBox(0, "Result", $result) |
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
| import random random.seed() iterations = 10000 matches = 0.0 numberofpeople = 23 daysinyear = 365 for iter in range(iterations): birthdays = [] for p in range(numberofpeople): birthdays.append(random.randint(1, daysinyear)) birthdays.sort() for i in range(1, numberofpeople): if(birthdays[i] == birthdays[i-1]): matches += 1 break print("Number of people : %d" % (numberofpeople, )) print("Days in year : %d" % (daysinyear, )) print("Number of iterations: %d" % (iterations, )) print("Number of matches : %d" % (matches, )) print("Probability of match: %f" % (matches / iterations, )) |
Resultaat:
1
2
3
4
5
| Number of people : 23 Days in year : 365 Number of iterations: 10000 Number of matches : 5049 Probability of match: 0.504900 |
[ Voor 9% gewijzigd door Gerco op 11-11-2005 15:38 ]
- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!
1
2
3
4
| 10 I=10000:G=23:J=365:DIM GP(G):RANDOMIZE TIMER:FOR X=1 TO I:FOR Y=1 TO G: GP(Y)=INT(RND*(J+1)):NEXT:FOR Y=1 TO G:FOR Z=Y+1 TO G:S=ABS(GP(Y)=GP(Z)): CL=CL+S:Y=Y+G*S:Z=Z+G*S:NEXT:NEXT:NEXT:PRINT"Clashes:";CL:PRINT"HIT%:"; CL*100/I:END |
Op mijn oude home computer kan je zelfs de spaties weglaten. Maakt het nog wat beter leesbaar.
[ Voor 29% gewijzigd door EXX op 11-11-2005 15:54 ]
For it is the doom of men that they forget... Huidige en vroegere hardware specs The Z80 is still alive!
EXX schreef op vrijdag 11 november 2005 @ 15:50:
de beloofde BASIC one-liner (GW-BASIC):
QBasic:
1...
edit:
Op mijn oude home computer kan je zelfs de spaties weglaten. Maakt het nog wat beter leesbaar.
En hoe lang doet jouw oude home computer over deze regel code?
Regeren is vooruitschuiven
10 iteraties duren ongeveer 80 seconden......T-MOB schreef op vrijdag 11 november 2005 @ 16:33:
[...]
offtopic:
En hoe lang doet jouw oude home computer over deze regel code?
Dus zou je de volledige 10000 iteraties laten lopen is het arme oude ding pakweg 22 uur en een kwartier bezig.
De door mij geliste one-liner is GW-BASIC, en dus getest op een PC, niet op mijn oude Z80 kist. Daar heb ik het progsel dus maar 10 iteraties laten doen.
edit:
Ik be niet zo bedreven in x86 Assembly, maar als ik een beetje tijd heb kan ik wel op mijn stuk antiek een stukje Z80 Assembly proggen en kijken hoe lang dat gaat duren in vergelijking tot BASIC
[ Voor 37% gewijzigd door EXX op 11-11-2005 17:07 ]
For it is the doom of men that they forget... Huidige en vroegere hardware specs The Z80 is still alive!
De java code met 3 loops kan natuurlijk wat eleganter...blizt schreef op maandag 07 november 2005 @ 21:51:
* blizt heeft de code van curry naar java omgeprutst:
[...]
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
33
34
| import java.util.HashSet; import java.util.Random; public class BP { //Constants for use in the application public static int c_Iterations = 10000; public static int c_GroupSize = 23; public static int c_DaysInYear = 365; public static void main(String[] args) { HashSet<Integer> group = new HashSet<Integer>(23); int clashes = 0; int iteration; // Randomize Random generator = new Random(); // Repeat for all iterations for (iteration = 0; iteration != c_Iterations; iteration++) { group.clear(); while(group.size() < c_GroupSize) { if(!group.add(new Integer(generator.nextInt(c_DaysInYear)))) { clashes++; break; } } } // Output results System.out.println("Clashes: " + clashes); System.out.println("Hit % : " + (double) clashes * 100 / c_Iterations); } } |
Wel leuk om te zien hoe jij het nu dus doet, had zelf ook plannen om het nog 'ns *netjes* te gaan doen zelf, alleen niet echt aan toegekomen..
United we stand, and divided we fall
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
| n = 10000;
pers = 23;
data = round(365*rndu(pers,n));
tel = 0;
for j (1,n,1);
if maxc(counts(data[.,j],seqa(0,1,365)))>1;
tel=tel+1;
endif;
endfor;
kans = tel/n;
kans; |
1
| k=1000;g=22;d=365;h=0.0;k.times do;r=[];for i in 0..(g-1);r[i]=rand(d);end;for i in 0..(g-1);for j in (i+1)..(g-1);begin;h=h+1if(r[i]==r[j]);end;;end;end;end;print"Hits: ",h,"\n";print"Iterations:",k,"\n";print"Hits /Iterations: ",(h/k),"\n" |
Wat is het nut van zo'n oneliner versie in het topic? De code verandert niet als je whitespace weghaalt, behalve dan dat het onleesbaar wordt en wss niemand verder gaat kijken dan de eerste 60 karakters.
Regeren is vooruitschuiven
Tsja, dit soort dingen doe ik omdat het kan. Ik gok dus dat het begrip 'plezier' meespeelde toen ik dit maakte. Helaas kan ik je daar geen codevoorbeeld van geven.T-MOB schreef op zaterdag 12 november 2005 @ 13:33:
offtopic:
Wat is het nut van zo'n oneliner versie in het topic? De code verandert niet als je whitespace weghaalt, behalve dan dat het onleesbaar wordt en wss niemand verder gaat kijken dan de eerste 60 karakters.
Dit was even een vingeroefening in de baas z'n tijd. Maar ik ben er zelf nog niet 100% content mee, het is nog weinig OO en ik heb het gevoel dat het nog strakker kan. Maargoed, ik kan niet teveel klootten onder werktijd.blizt schreef op vrijdag 11 november 2005 @ 20:11:
Dat leek mij oko al DaCoTa, zoals ik al later zei, had ik echt letterlijk de code van Curry omgezet
Wel leuk om te zien hoe jij het nu dus doet, had zelf ook plannen om het nog 'ns *netjes* te gaan doen zelf, alleen niet echt aan toegekomen..
chris schreef op zaterdag 12 november 2005 @ 13:36:
[...]
Tsja, dit soort dingen doe ik omdat het kan. Ik gok dus dat het begrip 'plezier' meespeelde toen ik dit maakte. Helaas kan ik je daar geen codevoorbeeld van geven.
Begrijp me niet verkeerd, ik snap de lol van dat soort dingen ook wel. Mijn punt is dat zo'n oneliner variant minder geschikt is om de syntax van verschillende talen te vergelijken. Het nodigt niet echt uit om te lezen, helemaal niet als je de taal verder niet kent. Ik had het idee dat het topic was uitgelopen op vergelijking van talen (ts al een tijd niet meer gezien). Het was verder niet de bedoeling om je te irriteren, als ik dat wel heb gedaan excuses.
Wat meer ontopic... Hier een implementatie in javascript (ja, ja vloeken in/14
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| // checks whether value exists in array function inArray(value,array) { for (var i=0;i<array.length;i++) { if (array[i] == value) { return true; } } return false; } // creates test group of size size, with poss possible // values. returns true when a collision is detected function testGroup(size, poss) { var aGroup = new Array(); for (var i=0;i<size;i++) { var birthday = Math.round(Math.random()*poss); if (inArray(birthday, aGroup)) { return true; } else { aGroup[i] = birthday; } } return false; } // Calculates the expected % of clashes based // on group size and posible values function realProbability(groupSize, poss) { var p = 100; for (var i = 0; i<groupSize; i++) { p = p * (1 - i / poss ); } return Math.round(100*(100 - p))/100; } // simulates the birthday problem with i iterations // on a group of size Groupsize, with poss possible // values function simulateBirthday(i, groupSize, poss) { var clashes = 0; var j = i; var output; while(j--) { if (testGroup(groupSize, poss)) { clashes++ } } var percentage = 100 * clashes / i; var expected = realProbability(groupSize, poss); output = 'Iterations: ' + i + '<br>' + 'Clashes : ' + clashes + '<br>' + 'Clash % : ' + percentage + '<br>' + 'Expected %: ' + expected + '<br>'; document.write(output); } //classic birthday... simulateBirthday(10000, 23, 365); |
Performance is me redelijk meegevallen. Omgeveer 2.3s met Firefox op een Athlon XP 3000+ bij 10.000 iteraties.
Regeren is vooruitschuiven
Verwijderd
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
| PROGRAM:BDPARDOX
:0->X
:
:For(D,0,10000,1)
:ClrList L1
:{0}->L1
:0->A
:0->E
:
:While A!=1
:E+1->E
:randInt(1,365)->B
:augment(L1,{B})->L1
:SortA(L1)
:prod(dList(L1))->C
:
:If C=0 or E=23
:1->A
:End
:
:If C=0
:X+1->X
:
:ClearHome
:Disp "MATCHES:",X,"ITERATIONS:",D,"RATIO:",X/D
:End |
De berekentijd schat ik zo ergens in de 22 uur. Dit heb ik uiteraard niet uitgetest.
Op de rekenmachine heb je een apart tekentje voor != en ->. Ook worden tabs niet gesupport op de rekenmachine; deze heb ik toegevoegd om het wat leesbaarder te maken.
Hmm, ik heb mijn eerste echte programma (tekst naar morsecode omzetten) geschreven na 2 weekendjes programmeren in BASIC. Ik was toen 13, en dat was ergens rond 1980.Icey schreef op maandag 07 november 2005 @ 11:30:
Na een maandje waarbij ik zo'n 4 uurtjes per week bezig was met Java had ik zelf al een applet gemaakt waarmee ik kon 'rock paper scissors'-en tegen 'de computer', die ook wat simpele statistieken bijhield (gemiddelde etc).
Waarmee ik wil zeggen dat als je niet kan programmeren en toch iets snel in elkaar wil zetten, je het beste gewoon met het ouderwetse regelnummer-gebaseerde BASIC kunt beginnen. Zelfs een kind van 13 snapt het nog, nadat hij alle voorbeeldjes uit de manual van zijn VIC-20 geprobeerd had.
Check hier eens: http://www.geocities.com/KindlyRat/GWBASIC.html.
Macbook Pro