Permalänk
Medlem

Slumpmässighetsgenerator...

Jag tänkte att detta är det forum som lämpar sig bäst för denna frågan.

Som vi alla vet så är datorer riktigt dåliga när det kommer till slumpmässighet.
Men en typ av generator som jag har funderat ett tag på som känns väldigt enkel är att ha en dedikerad liten krets integrerad i processorn vars enda jobb är att generera slumpmässiga tal.

Hur genererar man då detta?
Jo, kretsen räknar bara +1 hela tiden. Det är allt den gör. Den räknar +1 tills den når sitt maxvärde, säg 16-bitar, alltså 65535, sedan nollställs det och den börjar räkna om från början igen.
Det är alltså ett tal som aldrig står still och när programmet som behöver ett slumpmässigt tal hämtar detta värde i realtid så vet man alltså aldrig vad man kommer få.
Den räknar upp till talet tiotusentals gånger per sekund så det blir väldigt slumpmässigt vilket tal man får.

Detta är iaf min grundtanke, jag tycker det känns så enkelt och billigt i antalet transistorer för hur mycket man får av det.
Jag tänker ju framförallt på spel och sånt.

Finns det några problem med den här metoden?
Har någon annan tänkt på något liknande förut?
Varför finns det inte redan något liknande?

Permalänk
Medlem

isf kan du väll lika gärna använda datorns klocka som räknar milisekunder?

Dessutom: http://en.wikipedia.org/wiki/RdRand

Permalänk
Hedersmedlem
Skrivet av Kilroy:

Finns det några problem med den här metoden?

Förmodligen ger den inte så hög grad av slumpmässighet som man önskar även om resultatet ser slumpmässigt ut. Egentligen är det ju bara tid man räknar, så om man vet ett värde och hur långt efter nästa värde genererades borde man ha stora chanser att förutsäga även det senare värdet.

Skrivet av Kilroy:

FVarför finns det inte redan något liknande?

Det kom faktiskt nyheter i Ivy Bridge: http://spectrum.ieee.org/computing/hardware/behind-intels-new...

Permalänk
Medlem
Skrivet av Elgot:

Förmodligen ger den inte så hög grad av slumpmässighet som man önskar även om resultatet ser slumpmässigt ut. Egentligen är det ju bara tid man räknar, så om man vet ett värde och hur långt efter nästa värde genererades borde man ha stora chanser att förutsäga även det senare värdet.

Ja, så det duger ju inte alls till olika typer av säkerhetslösningar.
Men i spel osv så får man ju så hög grad av slumpmässighet som man kan tänka sig behöva tänker jag.
Och eftersom värdet är 0-65000 tiotusentals gånger per sekund så kan man ju inte som spelare utnyttja det tänker jag, det kommer att vara helt slumpmässigt.

Sen ser jag också fördelar med att ha en så här enkel och lättillgänglig slumpmässighetsgenerator till skillnad från mer avancerade som man inte har full tillgång till som har och göra med kryptering och säkerhet.

Eller?

Skrivet av Elgot:

Ah, jag hade för mig att det skulle komma i Haswell så jag har inte läst mer om det, men det ska jag göra nu, tack för länken.

Permalänk
Medlem

Den metoden skulle man helt klart kunna implementera men det skulle gå lika bra att göra det i programkoden. Det finns redan en sådan klocka i datorn processorn. Det finns också expansionskort som gör mätningarna på för att generera slumptal men minns inte riktigt vad det var de gjorde.
Faktum är också att de pseudoslumpgenerator som finns och används idag är tillräckligt slumpmässiga för att generera otroligt många slumptal som är 100% slumpmässiga. Det kan i princip göras hur många som helst och beror enbart på hur generatorn är programmerad. Svårigheten här blir i istället att använda ett slumpmässigt seed. Men det görs oftast med den metoden du nämnde. Fast man brukar ta antalet sekunder sedan 1970 som seed.
Det enda problemet är ju att om man vet koden kan man förutsäga svaret. Dock så är det givet två mätserier omöjligt att avgöra vilken som är pseudogenerarad och vilken som är "äkta" slumptal

Permalänk
Medlem

Det metod du beskrivit är inte ett dugg bättre än en gjord i mjukvara. För helt slumpmässigt får vi förlita oss på t.ex lavalampor : P

Permalänk
Medlem

Hade för ett par år sedan idén att sampla mikrofonporten efter statiskt brus. Det borde vara ganska slumpigt.

Skickades från m.sweclockers.com

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av SuperBerra:

Det metod du beskrivit är inte ett dugg bättre än en gjord i mjukvara.

Jag tänker att man inte behöver ha tabeller och sånt och att det därför skulle vara bättre med en sån här metod, eller någonting liknande.

Men jag har bara väldigt grundläggande förståelse av programmering så jag kanske har förbisett någonting, antingen för att det redan finns, för att det gör implementeringen krångligare än jag tänker mig eller någonting annat.

Skrivet av DevilsDad:

isf kan du väll lika gärna använda datorns klocka som räknar milisekunder?

Hur fungerar den, var sitter den?
Dock tycker jag 1000 per sekund är för lite, om vi tar spel som exempel så finns det snabba attacker som kommer inom en sekund eller tajmade attacker som kommer med regelbundna intervaller.
Med min metod så får vi hundratusentals "tärningsslag" varje sekund, med den klockan får man bara 10st "tärningsslag" varje sekund, men en hundrasidig tärning då.

Men jag vet inte, jag tycker bara min metod verkar så enkel och billig att implementera och att det skulle lösa ett litet problem.
Men problemet kanske är så litet att det ändå inte är värt det då det finns så många andra metoder...

Permalänk
Datavetare

Ditt problem är redan löst, Ivy Bridge har en krets som är "instabil" och därmed kan generera "äkta" slump, i ganska höga farter också, det handlar om 100-tals megabyte per sekund med "slump".

Om du ändå vill åt en väldigt snabb räknare finns det (minst) två st att tillgå på dagens datorer. Den ena är en s.k. HPET (High Precision Event Timer). Du kommer åt den via clock_gettime() på *NIX system och via QueryPerformanceCounter() på Windows. HPET har en upplösning på 1ns på den laptop jag skriver detta på (Sandy Bridge baserad).

Sedan kan man alltid läsa av klockcykel räknaren i CPUn. Detta har man kunnat ända sedan Pentium tiden har jag för mig. Enda sättet jag känner till är att göra en liten assemblersnutt, t.ex. så här om man kör med GCC

uint64_t read_tsc(void) { uint32_t lo, hi; __asm__ __volatile__("rdtsc" : "=a" (lo), "=d" (hi)); return (uint64_t) hi << 32 | lo; }

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Ditt problem är redan löst, Ivy Bridge har en krets som är "instabil" och därmed kan generera "äkta" slump, i ganska höga farter också, det handlar om 100-tals megabyte per sekund med "slump".

Om du ändå vill åt en väldigt snabb räknare finns det (minst) två st att tillgå på dagens datorer. Den ena är en s.k. HPET (High Precision Event Timer). Du kommer åt den via clock_gettime() på *NIX system och via QueryPerformanceCounter() på Windows. HPET har en upplösning på 1ns på den laptop jag skriver detta på (Sandy Bridge baserad).

Sedan kan man alltid läsa av klockcykel räknaren i CPUn. Detta har man kunnat ända sedan Pentium tiden har jag för mig. Enda sättet jag känner till är att göra en liten assemblersnutt, t.ex. så här om man kör med GCC

uint64_t read_tsc(void) { uint32_t lo, hi; __asm__ __volatile__("rdtsc" : "=a" (lo), "=d" (hi)); return (uint64_t) hi << 32 | lo; }

Ja men dåså, HPET är ju det jag pratar om i princip om man bara anpassade den till slumpmässighet.
Det kände jag dock inte alls till och det fanns inte när jag läste programmering.

Och klockcykelräknare skulle också kunna fungera, men det kände jag inte heller till. Tack för det.

Permalänk

Om du inte vill ha 1000 gånger per sekund i klockräknare kan du räkna nanosekunder istället. Det blir 1,000,000,000 gånger i sekunden.

Permalänk
Medlem

Förutom klockan brukar t.ex. accesstid på hårddiskar och muspekarens koordinater kombinerat och sedan kört det igenom någon kryptoalgoritm/hashalgoritm, för att sedan användas som seed och på så sätt få det så "random" som möjligt. Men IB's lösning verkar vara ett steg i rätt riktning, eftersom prollarna blir så små så kan de använda utrymmet för lite kryptografiska grejer.

Och jag kan inte tänka på slumpmässiga siffror utan att tänka på:

Visa signatur

Lian Li 6070B / Asus P8P67 B3 / Intel Core i5 2500K @ 4.5GHz
Corsair Vengance 8GB 1600MHz / Asus GTX780 / Corsair TX650V2

Permalänk
Medlem

Jag tycker att tillräckligt mycket har skrivits om slumptalsgeneratorer i tråden och jag vet inte hur mycket TS kan eller vet om användningen men jag skulle starkt tvivla på att det finns någon större användning av dom i spel. Jag har själv använt mig av en del slumptal (ganska många faktiskt) och jag har fått berättat för mig att våra mjukvaru-generatorer kan ha "serier" dvs att slumptalen upprepar sig. OM!: man drar en sådär 10 miljoner stycken i rad. Och då använder vi sådana tal i statistik där det faktiskt kan vara viktigt och inte i spel. Därmed inte sagt att spel inte är viktigt men det är knappast något som skulle förstöra spelupplevelsen.

Visa signatur

Custom Built Chassis|CM Silent 1000W Mod|Asus P6X58D-E|i7 930@4.2ghz ht on| 6Gb Corsair Dominator @1604MHz| Evga & Zotac Gtx 470 SLI @ 800,1600,1674 & Asus 8600gt physX dedicated| WD Green 1Tb+1Tb WD Black sata 3 +1Tb extern|Intel SSD 80Gb X25-M G2|Logitech MX518 & G15| H2O|Shure SRH840
http://valid.canardpc.com/show_oc.php?id=2223280

Permalänk

Allmänt om slumptal

Att förlita sig på något som tickar fram i konstant hastighet fungerar inte för att generera slumptal. Anledningen är ganska simpel.

Vi har en processor som tickar på i 100 steg i sekunden.
Nu skriver vi en funktion som använder ett slumptal.
När vi kör funktionen så visar det sig att det tar exakt 10 steg att exekvera den.
När vi nu loopar denna funktion så innebär det att vi kommer att läsa av klockan vart 10 steg. Eftersom klockan är linjär så vet vi att nästa tal kommer exakt ha en differens på 10 steg. Eftersom skillnaden alltid är konstant innebär det att våra slumptal inte alls är beroende på slump utan är helt linjärt genererade.

Ivy Bridge är helt klart intressant men det krävs förstås att det implementeras överallt.

När man pratar om serier eller tabeller så pratar man om en speciellt egenskap hos mjukvarubaserade lösningar. Nämligen att dessa generatorer arbetar med tillstånd. Om vi har en slumplatsgenerator som befinner sig i tillstånd A och vi sen får fram tillstånd B, så vet vi med säkerhet att nästa gång vi har A kommer B att följa.

En simpel generator. Vi har en variabel, slump, som endast kan innehålla siffrorna 0-4.

slump = 11 * seed + 3

Låt oss initiera vår generator med seed=4 och sen hämta ut ett par värden.

seed = 4 slump = 11 * 4 + 3 ger oss att slump = 2 Eftersom slump endast är mellan 0-4. Överflödet försvinner. seed = 2 Bytar tillstånd på generatorn genom att använda vårt föregående slumptal. slump = 11 * 2 + 3 ger slump = 0 seed = 0 slump = 11 * 1 + 3 ger slump = 3

Generatorn kommer alltså ge ut talen [2 0 3 1 4 2 0 3 1 4] om den körs 10 gånger. Notera att den återupprepar sig. En mjukvarubaserad lösning kommer alltså aldrig kunna generera fler tal än vad som får plats i dess tillstånd. Troligt vis får man fram färre tal. Väljer vi ett annat tal på som startvärde istället för seed=4 så motsvarar det att vi väljer slumptal ur en ny tabell eftersom en ny serie tal kommer att genereras.

I spel är man inte direkt bunden till kvalitén på generatorn eftersom användaren förändrar värden genom att styra karaktärer osv som helt förändrar spelvärden och därav hur datorns AI kommer att reagera.

Permalänk
Rekordmedlem

Via har väl haft en slumptalsgenerator rätt länge http://www.via.com.tw/en/downloads/whitepapers/initiatives/pa...
De har kanske inte de beräkningssnabbaste cpuerna, men de har trotts allt sina nischer.

Visa signatur

R5 5600G, Asus ROG STRIX X470-F Gaming, WD SN850X 2TB, Seasonic Focus+ Gold 650W, Aerocool Graphite v3, Tittar på en Acer ET430Kbmiippx 43" 4K. Lyssnar på Behringer DCX2496, Truth B3031A, Truth B2092A. Har också oscilloskop, mätmikrofon och colorimeter.

Permalänk
Medlem
Skrivet av santair:

Jag tycker att tillräckligt mycket har skrivits om slumptalsgeneratorer i tråden och jag vet inte hur mycket TS kan eller vet om användningen men jag skulle starkt tvivla på att det finns någon större användning av dom i spel. Jag har själv använt mig av en del slumptal (ganska många faktiskt) och jag har fått berättat för mig att våra mjukvaru-generatorer kan ha "serier" dvs att slumptalen upprepar sig. OM!: man drar en sådär 10 miljoner stycken i rad. Och då använder vi sådana tal i statistik där det faktiskt kan vara viktigt och inte i spel. Därmed inte sagt att spel inte är viktigt men det är knappast något som skulle förstöra spelupplevelsen.

För att ta ett exempel vad som skulle kunna ställa till med problem så låt säga att det är en slumpgenerator som bestämmer när en ovanlig monster ska dyka upp. Slumpgeneratorn räknar upp med 1 varje klockcykel till 65000. Vi vill att monstret ska dyka upp ungefär 1 gång per 6500 sekunder. Lätt som en plätt, varje sekund läser vi ut vad slumptalet/klockan visar, och är den mellan 1-10 spawnar vi monstret. För att göra det extra spännande vill vi även slumpa fram hur mycket HP monstret har, mellan 1 och 100. Lika lätt är det, läs ut vad slumptalet är och dela med 650. Det tar ca 1000 klockcykler mellan vår kodrad som säger till datorn att ta det första slumptalet och det andra slumptalet som bestämmer HP. Det gör att monstret kommer att ha under 10 i HP varenda gång det spawnar!

Även om mitt exempel är väldigt enkelt och konstruerat gäller det att veta vad man gör när det kommer till slumptal, det är lätt hänt att det blir en intressant effekt annars Som tur är finns andra som redan tänkt på det här väldigt mycket, och om man bara använder best practice och färdiga algoritmer för att ta fram sina slumptal är det ganska liten chans för konstiga fel. Du skriver att ni använder slumptal i statistikberäkningar, då låter det tex viktigt att slumptalen är jämnt fördelade för att det inte ska bli fel, och tänk vilken problem det vore om resultatet blev olika beroende på vilken tid på dagen beräkningen gjordes...

Sluligen, om man räknar in casino-spel i kategorin spel är man ute på riktigt hal is utan en väldigt djup kunskap. Det har bl.a. varit folk som knäckt slots på casinon pga att slumpserien upprepade sig vilket kan bli väldigt dyrt.

Edit: Ska lägga till att jag tycker hela frågeställningen är intressant så inget ont om Kilroy som skapade tråden.

Permalänk
Medlem
Skrivet av vb:

För att ta ett exempel vad som skulle kunna ställa till med problem så låt säga att det är en slumpgenerator som bestämmer när en ovanlig monster ska dyka upp. ...
...

Edit: Ska lägga till att jag tycker hela frågeställningen är intressant så inget ont om Kilroy som skapade tråden.

1) För att kritisera "slumpen" som var involverad i ditt spelexempel så skulle jag gissa att det leder till en trevligare spelupplevelse om man konstruerade "spawntiden" till 6000sekunder + ett tal som är normalfördelat kring 500. LLN http://en.wikipedia.org/wiki/Law_of_large_numbers skulle iofs ge en liknande fördelning men vi kan konstruera samma fördelning som du gjorde med färre klockcykler och vi kan dessutom kontrollera det mycket bättre se nedan.

2) Det är fortfarande inte av vikt att dessa fördelningar i spel blir perfekta då det inte påverkar spelet om det är en serie eller ej. Som du själv sa så är det viktigt i casinon eller liknande men vem bryr sig om monstrena spawnar med samma intervall som tidigare efter 1000 timmars speltid. Det finns ingen som kan komma ihåg en så lång serie så länge man inte använder var 1000de tal eller liknande (som du gjorde).
Vi kan nämligen skapa ett tal från vilken fördelning vi vill med endast ett (0,1) uniformt fördelat tal mha inversetransformering http://en.wikipedia.org/wiki/Inverse_transform_sampling och vi kan då skapa exakt samma fördelning (för spawntid) som du gjorde fast med bara 1 slumptal istället för med 65000 stycken. Så du ser att de räcker ganska så långt.

Visa signatur

Custom Built Chassis|CM Silent 1000W Mod|Asus P6X58D-E|i7 930@4.2ghz ht on| 6Gb Corsair Dominator @1604MHz| Evga & Zotac Gtx 470 SLI @ 800,1600,1674 & Asus 8600gt physX dedicated| WD Green 1Tb+1Tb WD Black sata 3 +1Tb extern|Intel SSD 80Gb X25-M G2|Logitech MX518 & G15| H2O|Shure SRH840
http://valid.canardpc.com/show_oc.php?id=2223280

Permalänk
Medlem

Om jag inte minns helt fel så finns det någon tredjeparts mjukvara som använder kosmisk bagrundsstrålning som seed för att generera slumptal. Vet att jag snubblade över detta när jag letade efter något helt annat men jag kommer inte ihåg namn.

Skickades från m.sweclockers.com

Visa signatur

"This is VAR, spelled A-U-T-O"

Permalänk
Rekordmedlem
Skrivet av Kreppe:

Om jag inte minns helt fel så finns det någon tredjeparts mjukvara som använder kosmisk bagrundsstrålning som seed för att generera slumptal. Vet att jag snubblade över detta när jag letade efter något helt annat men jag kommer inte ihåg namn.

Skickades från m.sweclockers.com

En mjukvara kan inte ensam detektera stokastiskt brus, det måste finnas en sensor av nån sort.

Visa signatur

R5 5600G, Asus ROG STRIX X470-F Gaming, WD SN850X 2TB, Seasonic Focus+ Gold 650W, Aerocool Graphite v3, Tittar på en Acer ET430Kbmiippx 43" 4K. Lyssnar på Behringer DCX2496, Truth B3031A, Truth B2092A. Har också oscilloskop, mätmikrofon och colorimeter.

Permalänk
Medlem
Skrivet av mrqaffe:

En mjukvara kan inte ensam detektera stokastiskt brus, det måste finnas en sensor av nån sort.

Nej det stämmer. Är inte insatt i hur den tar fram seed men bara att den använde kosmisk bakgrundsstrålning för att generera en seed för slumpmässighet.

Visa signatur

"This is VAR, spelled A-U-T-O"

Permalänk
Medlem
Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail