Sida 1 av 4

hur programmerar man egentligen slump?!?

Postat: 13 jun 2007, 21:23
av Chippen
Jag har funderat på en sak... hur har man egentligen gjort för att imitera slump i datorer... visst har jag skrivit tärningar och liknande, men då använder man ju färdiga slump funktioner... men hur ser dem funktionerna ut egentligen, det övergår mitt förstånd...

SV: hur programmerar man egentligen slump?!?

Postat: 13 jun 2007, 21:28
av Emil.s
Vad jag vet så använder datorn systemklockan, och sedan generera ett nummer från den. Bör ju inte vara allt för svårt att göra en egen slump funktion egentligen.  8)

SV: hur programmerar man egentligen slump?!?

Postat: 13 jun 2007, 21:34
av Chippen
ganska smart... hur djup är systemklockan, alltså räknar den sekunder, räknar den hundradelar??

SV: hur programmerar man egentligen slump?!?

Postat: 13 jun 2007, 21:35
av Christian Johansson
Jag stötte på slumptal en del när jag studerade på LTH men det var rätt länge sedan nu. Jag har för mig att det fanns krav i en kurs i stokastiska processer eller liknande på att följden av tal skulle vara repeterbar och talen skulle vara oberoende och lika fördelade för att det skulle vara en bra slumptalsgenerator. Vi använde i någon annan kurs där vi behövde slumptal en algoritm från en vetenskaplig artikel som skulle ge sådana egenskaper. Senare såg jag i källkod på Ericsson i Lund att man använde exakt samma algoritm med hänvisning till samma artikel för att generera slumptal så det berodde nog på kontakterna med LTH som bara låg några meter därifrån.

SV: hur programmerar man egentligen slump?!?

Postat: 13 jun 2007, 21:47
av Bossieman
Det här med slumptal är ytterst klurigt och de skapar mycket frågeställningar.

Det måste finnas ramar för vilka tal som kan användas. T.ex. välj ett heltal mellan 1 och 10 definierar ett omfång av vilka tal som vi ska använda som underlag för slumpen. Detta är  isig då stridande mot att skapa ett slumptal. Hur kan det vara et tslumptal när vi definierat vilka resultat det kan bli?

Slumptal, äkta går inte att få fram då det finns en begränsning i mätmetoderna. Men vi kan få fram slumptal som följer vissa ramar. T.ex.

1. Talet är mellan 1 och 10
2. Det får högst ha 3 decimaler.

Detta ger oss 9000 tal att välja slumpmässigt mellan, men inget av talen är slumptal. Hoppas detta inte verkar för flummigt.

SV: hur programmerar man egentligen slump?!?

Postat: 13 jun 2007, 21:53
av Chippen
Jag tror jag försår lite vad du menar bossieman, och det var lite det svaret jag hade hoppats på... alltså att det är omöjligt att slumpa tal om man har metoder som bygger på givna tal... (om jag förstod dig rätt vill säga?)

Dock kan man imitera slump genom det Christian Johansson talar om?

SV: hur programmerar man egentligen slump?!?

Postat: 13 jun 2007, 21:56
av Bossieman
Precis, det är lite som att man ställs inför följande val

Anta att du befinner dig i origo och du ska ta ett steg i en slumpmässig riktning och vi säger att du kan ta detta steget slumpmässigt. Vad är då sannolikheten att du hamnar där du hamnade eller vad är sannolikheten att du valde en viss riktning?

SV: hur programmerar man egentligen slump?!?

Postat: 13 jun 2007, 21:57
av Emil.s
Chippen skrev: ganska smart... hur djup är systemklockan, alltså räknar den sekunder, räknar den hundradelar??
Hundradelar bör den ju räkna med. Det gör ju ett vanligt stoppur i en armbandsklocka.
Och om programmet då tar 10 hundradelar, och sen gör om det till kanske milliondelar så blir det ju en del.
Men nog är det klurigt som Bossieman säger.  8)

Men för att få något slumpat så lär man ju ha något som är oregelbundet. Förslagsvis tiden. :)

SV: hur programmerar man egentligen slump?!?

Postat: 13 jun 2007, 22:26
av Smygis
Det gör man inte, För att citera Pythons beskrivning av deras random modul "Generate pseudo-random numbers". Man kan aldrig få riktiga slumpal med en dator. I och med att datorn bara kan räkna på datan man säger åt den att räkna på och kan endast behandla den på det sätt man säger åt den att behandla den på. Så går det inte att få riktiga slumptal.

Som man gör nu tar man helt enkelt en siffra (Oftast sekunder sedan Unix epoch, 00:00:00 UTC, January 1, 1970. Eller föregående framslumpade tal.) och kör den siffran gennom en algorithm så det ser ut som att det är ett slumptal.

SV: hur programmerar man egentligen slump?!?

Postat: 13 jun 2007, 22:37
av Lars
Här är ett väldigt simpelt exempel på hur man kan generera pseudo-slumptal:

Kod: Markera allt

#!/usr/bin/python

x = 1

def rand():
    global x
    x = (1366*x + 150889) % 714025
    return x

for a in range(100):
    print rand()
Observera att det här ger en helt deterministisk talserie, men den beter sig "slumpmässigt". För att inte få samma talserie varje gång brukar man sätta startvärdet till aktuellt klockslag t.ex. Om man har krav på distribution, tid mellan upprepning o.s.v. så får man använda mer avancerade algoritmer.

Linux genererar slumptal som kan läsas från /dev/random och /dev/urandom, det sker bl.a. genom att mäta nätverkstrafik och tangenttryckningar för att få in mer "riktigt" slump i det hela.

SV: hur programmerar man egentligen slump?!?

Postat: 13 jun 2007, 22:53
av rancor
Ett sätt kan vara att filma en lavalampa och generera värden av själva utseendet som lavaklumpen har då man önskar ett slumpvärde. Då borde man få det frö man är ute efter.

Lika så borde vara att sätta upp en kamera över en hårt trafikerad väg samt mäta buller, vindhastighet och luftfuktighet och göra någon smart beräkning av dessa värden.

SV: hur programmerar man egentligen slump?!?

Postat: 14 jun 2007, 00:39
av Galgalid
Good luck ^^

SV: hur programmerar man egentligen slump?!?

Postat: 14 jun 2007, 12:21
av Mekaniserad Apelsin
rancor skrev: [...]filma en lavalampa [...] sätta upp en kamera över en hårt trafikerad väg samt mäta buller, vindhastighet och luftfuktighet [...]
Eller så köper man hårdvara som faktiskt genererar äkta helt randomatiserade talserier...

De är svindyra och använder faktiskt något som i verkligheten är "random" (så vitt vi vet idag): sönderfallande isotoper.

SV: hur programmerar man egentligen slump?!?

Postat: 14 jun 2007, 12:27
av Sprak
Mekaniserad Apelsin skrev: sönderfallande isotoper.
Kul att sitta brevid en radioaktiv dator...

SV: hur programmerar man egentligen slump?!?

Postat: 14 jun 2007, 13:20
av Lars
Hm, undrar om man kan bygga om en brandvarnare till en slumpgenerator på något sätt, kunde ju vara ett kul projekt ...

SV: hur programmerar man egentligen slump?!?

Postat: 14 jun 2007, 14:55
av Louie
Eller så löser du ut slumtal från myrornas krig på tv eller tar in bakgrundsstrålning från rymden. Bara några av de saker jag brukar göra när jag har tråkigt  ::)

SV: hur programmerar man egentligen slump?!?

Postat: 16 jun 2007, 21:55
av madbear
Louie skrev: Eller så löser du ut slumtal från myrornas krig på tv eller tar in bakgrundsstrålning från rymden. Bara några av de saker jag brukar göra när jag har tråkigt  ::)
myrornas krig är väl data? inte slump!

SV: hur programmerar man egentligen slump?!?

Postat: 16 jun 2007, 22:10
av Barre
i linux har du två device-filer
/dev/random
/dev/urandom


dessa två är character baserade device filer (oj, vilken snygg svenska) är ett interface in i linuxkärnans slumpgenerator.
slumpgeneratorn samlar på "störningar" från datorn, t.ex störningar från diverse device drivers till en pool av bitar.
/dev/random lämnar ifrån sig bytes skapade från dessa bitar, och om poolen av bitar skulle ta slut så "hänger" den sig tills tillräkligt med bitar fyllts på i poolen igen.
/dev/urandom lämnar också ifrån sig bitar från kärnans slumpässigt skapade bit-pool, men om poolen skulle tömmas så "hänger" den inte. Istället så lämnar den ifrån sig en teoretisk skapad slump (som inte är så säker, men duger kanske för det mesta).

om jag inte missminner mig så fylls denna bit-pool på av musrörelser, disk-, cpu-, minnes- och tangentbordsaktivitet...

SV: hur programmerar man egentligen slump?!?

Postat: 16 jun 2007, 22:18
av Hund
scrav skrev:
Louie skrev: Eller så löser du ut slumtal från myrornas krig på tv eller tar in bakgrundsstrålning från rymden. Bara några av de saker jag brukar göra när jag har tråkigt  ::)
myrornas krig är väl data? inte slump!
Det engelska ordet låter tuffare - White noise ;D

Såhär säger Wikipedia:

Vitt brus är en signal som har genererats av en stokastisk process. Vitt brus kännetecknas av att det innehåller alla frekvenser med samma sannolikhet och genomsnittliga energi, och att dess autokorrelation är noll för alla nollskilda tidsdifferenser. Motsatsen är färgat brus. Eftersom vitt brus ska innehålla samma energi vid alla frekvenser blir det en fysikalisk omöjlighet, då detta skulle innebära oändlig energi. Man menar därför oftast "bandbegränsat vitt brus", det vill säga brus som kan anses vitt inom ett begränsat frekvensband, då man talar om vitt brus.

Bruset är bakgrundsstrålning, främst i form av radiovågor, som antennen tar emot. Strålningen härstammar till största delen från rymden, speciellt Solen.

SV: hur programmerar man egentligen slump?!?

Postat: 16 jun 2007, 23:11
av Mekaniserad Apelsin
Hund skrev: Man menar därför oftast "bandbegränsat vitt brus", det vill säga brus som kan anses vitt inom ett begränsat frekvensband, då man talar om vitt brus.

Bruset är [...]trålningen härstammar till största delen från rymden, speciellt Solen.
Jag har alltid tyckt att de här säger mot varandra. Solens strålning följer ganska noggrant Planck's lag, och är därför inte "vitt" någonstans.