Welke programmertaal voor simpele berekeningen?

Pagina: 1 2 Laatste
Acties:
  • 926 views sinds 30-01-2008
  • Reageer

Verwijderd

Hier een versie in Autoit3. Autoit bevatte een kleine bug, waardoor in een while lus de increment niet werd onthouden: hier dus een inefficientere versie met alleen for loops:

code:
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)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20-04 18:28

Gerco

Professional Newbie

Volledig ten overvloedde, birthday paradox in Python:

Python:
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:
code:
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!


  • EXX
  • Registratie: Juni 2001
  • Laatst online: 20-04 20:41

EXX

EXtended eXchange

de beloofde BASIC one-liner (GW-BASIC):

QBasic:
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


;)

edit:
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!


  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 20:39
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.
offtopic:
En hoe lang doet jouw oude home computer over deze regel code?

Regeren is vooruitschuiven


Verwijderd

What about Assembler? :P

  • EXX
  • Registratie: Juni 2001
  • Laatst online: 20-04 20:41

EXX

EXtended eXchange

T-MOB schreef op vrijdag 11 november 2005 @ 16:33:
[...]

offtopic:
En hoe lang doet jouw oude home computer over deze regel code?
10 iteraties duren ongeveer 80 seconden......

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!


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 23:25
blizt schreef op maandag 07 november 2005 @ 21:51:
* blizt heeft de code van curry naar java omgeprutst:
[...]
De java code met 3 loops kan natuurlijk wat eleganter...
Java:
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); 
    } 
}

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 29-09-2025

blizt

Wannabe-geek

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.. :(

United we stand, and divided we fall


Verwijderd

Hier de code is Gauss:


code:
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;

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Hier nog de one-line versie in ruby:
code:
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"

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 20:39
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.

Regeren is vooruitschuiven


  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
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.
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.

  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 23:25
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.. :(
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.

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 20:39
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.
offtopic:
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 ;) ) om birthday problemen te simuleren. De logica bestaat uit de volgende functies:
Java:
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

Dit is de TI83+ versie! Ook getest op de TI83 en de TI84. Waarschijnlijk werkt het ook op andere TI rekenmachines.
code:
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. :P
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.

  • RetepV
  • Registratie: Juli 2001
  • Laatst online: 27-10-2025

RetepV

ALLES valt te repareren

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

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

Pagina: 1 2 Laatste