ASP | Bakom Dimridån

Bakom Dimridån

med Tom Stone

Pseudoslumptal i ASP

Ihopknåpat av Tom Stone en onsdag i december, 2008

Till Kent Izakssons personliga rekommendationsbrev som jag skrev om i föregÃ¥ende artikel, sÃ¥ tänkte jag att det kunde vara fiffigt att utgÃ¥ ifrÃ¥n besökarens namn och göra sÃ¥ varje besökare fick en unik version av brevet. För att Ã¥stadkomma det, sÃ¥ beslöt jag mig för att addera ihop ASCII-värdena av varje bokstav i besökarens namn, och använda den summan som ett “seed”-värde i en pseudo-slumptalsgenerator (dvs. att varje “seed”-värde alltid resulterar i samma sekvens slumptal).

Oturligt nog ligger Håkan Bergs sida på en Windows-server, så jag kunde inte skriva programkoden i PHP som vanligt, utan i ASP som jag aldrig någonsin sysslat med innan. Och efter en del googlande, så verkade det som att det inte fanns någon, redan färdig, slumptalsgenerator. Så vad gör man då? Fixar det själv, såklart!

SÃ¥ istället googlade jag pÃ¥ teorierna bakom en pseudorandom generator, och till min förfäran var matematiken i de flesta fallen lÃ¥ngt över mitt huvud… tills jag fann noteringar om Park-Millers linjärt kongruenta pseudoslumptalsgenerator. Vilken är som lyder:

Xk+1=Xk*g MOD n

Där n är ett primtal och g är en primitiv rot modulo n.
Som n valde jag först ett s.k. Mersenne primtal, men det gav frekventa “overflow errors”, vilket betydde att ekvationen kom upp i sÃ¥ höga tal att servern inte klarade av det. Efter mer googlande, sÃ¥ fann jag istället Fermats primtal, och med det ordnade problemet upp sig.

Så resultatet i ASP-kod blev alltså såhär:

< %
'Baserat på Park Miller linear congruential pseudo-random number generator. Från 1988
Function gen()
		seed = (seed * 75) mod 65537
		gen=seed
End Function
%>

För att kunna använda det smidigare, så skrev jag även följande funktioner:

< %
'För att få ett slumpmässigt heltal
Function nextInt()
		nextInt=gen()
End Function

'För att få ett slumptal av decimaler mellan 0,0 och 1,0
Function nextDouble() '0 till ett
		nextDouble=(gen()/ 65537 ) 'Fermats tal
End Function

'För att få ett heltals-slumptal mellan två värden, t.ex. mellan 10 och 20
Function nextIntRange(Min, Max) 'mellan Min och Max
		Min=Min-0.49999
		Max=Max+0.49999
		nextIntRange=Round(Min + ( (Max - Min) * nextDouble() ))
End Function

'För att få slumptal med decimaler mellan två värden
Function nextDoubleRange(Min, Max) 'mellan Min och Max
		nextDoubleRange=Min + ( (Max - Min) * nextDouble() )
End Function

'För att få ett booleanskt binärt slumptal
Function coinToss()
	If Round(nextDouble() )=1 Then
		coinToss = True
	Else
		coinToss = False
	End If
End Function
%>

Och så här används funktionerna

< %
Dim seed
seed=37 'vilket tal som helst funkar. Jag utgick ifrån ASCII-värdena av besökarnas namn
Response.Write nextIntRange(100,500) 'Skriver ut ett heltal mellan 100 och 500
%>

Inte så illa för att vara ett första försök, eller hur?

Skriv gärna en kommentar

Ämne: kodning

Bli rekommenderad!

Ihopknåpat av Tom Stone en lördag i november, 2008

Jag har precis blivit klar med en slags automatiskt personligt rekommendationsbrev åt framgångskonsulten Kent Izaksson (ett alterego för komikern Håkan Berg ). Något som kan vara användbart i dessa krisens dagar, då många eventuellt får se sig om efter nya jobb. Ta en titt på det personliga rekommendationsbrevet.

Projektet var inte helt okomplicerat, då det krävdes en hel del programmering i ASP, något jag aldrig pysslat med tidigare, men jag är rätt nöjd med resultatet! Kommer eventuellt att posta några progamkods-snuttar senare.

Projektet knyter an till att Kent Izaksson har fått en egen avdelning, en under-sajt, på Håkan Bergs sida. Även det projektet var rätt komplicerat. Designmässigt ville jag att det skulle se ut som en kombination av en normal konsult och en begagnad bilförsäljare, men ha tillräckligt många udda finesser att det ändå kändes exklusivt. Första beslutet var att strunta helt i att få sidan att se bra ut i Internet Explorer 6, eftersom det tar nästan månader av jobb att kompensera för det tusental buggar som det jävla programmet har. Version 7 har ju funnits ute ett bra tag, och version 8 kommer att släppas vilken dag som helst. Och fungerande alternativ har ju funnits hur länge som helst, i form av Firefox, Safari, Opera och nu senast, Google Chrome. Så folk som är för slöa för att uppgradera förtjänar helt enkelt inte att få se bra sidor.

I övrigt består Kent Izakssons sajt av en mängd avancerade trixs med CSS och Javascript (via javaskriptbiblioteket Mootools ), samt att jag haft fria händer med att skriva vad jag vill, vilket resulterade i bl.a. rekommendationsbrevet ovan, en biografi över tre generationer av Kents familj, ett slags Nigeriabrev och många andra smålustigheter. Ta en titt på sidan för konsulten Kent Izaksson .

Kommentar (1)

Ämne: kodning

Tanke:

Bara för att folk tycker du är obegriplig, så betyder det nödvändigtvis inte att du är en konstnär.
Magisk show för Haiti Charlie Caper vann! Axel Adlercreutz i Talang 2009