Randomize med AVR?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Randomize med AVR?

Inlägg av Korken »

Hej alla glada!

Går det att köra rand() med AVRs?
Jag har testa de vanliga rutinerna för C men det fungerar inte.
Eller måste man göra en egen rand()?

//Emil
Användarvisningsbild
flippy
Inlägg: 110
Blev medlem: 10 december 2005, 13:49:44

Inlägg av flippy »

Jag vet inte, men du kan testa att skriva en egen.
Jag hittade nåt intressant på mathworld, här är lite länkar:

http://mathworld.wolfram.com/Rule30.html
http://mathworld.wolfram.com/RandomNumber.html
http://mathworld.wolfram.com/Elementary ... maton.html
http://www.wolframscience.com/nksonline/page-25
http://www.wolframscience.com/nksonline/page-865a-text

Blev lite många länkar, men jag ska nog själv ta att skriva ihop lite kod imorgon.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Som lite bakgrund (jag är inte helt säker på att du har insett problemet
med "random" funktioner på en mikrokontroller) har du en del exempelkod
här : http://www.piclist.com/techref/microchip/rand.htm.
Det finns även en del diskussioner kring slumptal.
Sidan är i och för sig till PIC, men det mesta gäller generellt.

För övrigt går det knappast att svara på din fråga utan att du
specar lite mer kring hur dina slumtal ska se ut. Min/max värde och
fördelning t.ex. Är pseudo fördelning OK ? Eller behöver du fullständing
slumpmässighet ?
Senast redigerad av sodjan 18 september 2006, 00:18:46, redigerad totalt 1 gång.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Det ska vara 0-255 alltså en byte.
Den behöver inte vara 100% slummessig men så att det inte är 5olika den går imellan.

Och jag ser inte problemet med slumptal in en uC. Förklara gärna varför!

Edit: Det ska vara för att slumpmässigt tafram färger i mitt lilla RGB projekt, om nån undrar.

//Emil
optimizer
Inlägg: 74
Blev medlem: 5 juli 2006, 17:35:10
Ort: norrköping
Kontakt:

Inlägg av optimizer »

Ett enkelt sätt som jag brukar göra är att ha en räknare på interrupt i bakgrunden som jag när jag behöver plockar ett tal ifrån. typ en 8-bitars räknare. dock så blir det samma "slumptal" nästa gång du bootar om den.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Visst funkar rand() kom ihåg att inkludera stdlib.h ^^
Tyvär så är slumptal matimatisk fram räknad så det är inte riktigt slumptal...
Dock finns det uC med RNG (Random Number Generator) men de är inte så vanliga...
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Funkar rand()?
Jag får bar "warning: unused variable `slumptal'" när jag kör den.

Kan du posta ett exempel?

//Emil
Användarvisningsbild
Icecap
Inlägg: 26662
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Du menar att kompilern varnar om att du inte använder variablen som heter 'slumptal' till något har med om 'rand()' fungerar eller inte?

Det har ju inget med 'rand()' att göra, det är helt enkelt DU som har "glömt" att sedan ANVÄNDA 'slumptal' till något.....
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Kod: Markera allt

#include <avr/io.h>
#include <stdlib.h> 

int main(void){
	
	DDRB = 0xff;
	for(;;){
		PORTB = (unsigned char) rand();
	}
}
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Aha! De va de ju!
Tack för hjälpen!

Men, om jag gör tex

Kod: Markera allt

rgb_comp((unsigned char) rand(),(unsigned char) rand(),(unsigned char) rand());
KOmmer det bli 3st olika tal då?
För ibland måste man gör saker i olika tidspunkter för att de ska fungera.

//Emil
Användarvisningsbild
Icecap
Inlägg: 26662
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jo, det borde fungera men det beror på hur det tal som rand() returnerar sparas under funktionens gång. Det finns bara ett sätt: testa!

I teorin ska det fungerar men det kan vara kompilermässiga anledningar till att det inte gör.
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Jag har för mig att rand() kommer att generera samma serie av tal efter omstart av µC:n. Däremot så ska nog inte srand() göra det. Som sagt. testa dig fram.

Om du gör en modulus operation på det genereade talet kan du bestämma maxärdet också. Annars blir RAND_MAX 0x7FFF.

Exempel: uint8_t random = srand() % 50; // max returnerat värde blir då 50... eller 49?! :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Och jag ser inte problemet med slumptal in en uC. Förklara gärna varför!

Prolemet är att man sällan har en *oberoende* källa till sluptalen.
Man kan köra med "free-running" timers eller liknande, men det är
endå väldigt lätt att man hamnar i ett läge där man får repeterande
sekvenser som inte lägre är "slupmässig". Visas värden kanske kommer
oftare än andra och andra kanske missas helt.

Sen är det också frågan om man t.ex vill ha värden 0-255 där alla
värden ska vara med innan ett värde upprepas.

En metod är att generera en sekvens i förväg och lägga in som en
tabell.

Full slumpmässighet kan uppnås med en extern bruskälla som man
läser av. Ett exempel fanns på de länkar jag postade förrut.

Kolla vad dokumentationen säger om rand(), det borde finnas beskrivet
vilken metod de använder, sannolikt en matematiskt variant...
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Precis som sodjan säger, en µC eller liknande logisk enhet är per definition helt oförmögen att generera slumptal.
Varför? För att de är uppbyggda helt av logik. Slumptal är så långt från logik man kan komma. Dessa passar helt enkelt inte ihop.

Naturligtvis finns det lösningar på problemet. Med yttre påverkan klarar man sig bra. Likaså går en matematisk förutbestämd talsekvens att göra så den ser slumpmässig ut, även om den inte är "äkta" slump (alltså stokastisk).

rand() fungerar bra, men största problemet är att den upprepar samma sekvens varje gång du startar om ditt program (nu pratar jag den som ingår i libc för GCC).
Jag tar till följande knep för att lösa detta:
Vid uppstart, läs variabel från förutbestämd plats i EEPROM och låt denna vara seed åt rand (genom att ange det som argument till srand().
Direkt efter, modifiera variablen på godtyckligt sätt, för att inte läsa samma vid nästa uppstart.
Detta fungerar jättebra och du slipper att få samma "slump"-sekvens varje gång du startar om (om det nu är önskvärt).

Edit: Stava
Senast redigerad av $tiff 17 september 2006, 15:32:35, redigerad totalt 1 gång.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

De med variabel i EEPROM är smart!
Nu ska jag bara lära mig hur man pillar med EEPROM. :)

Sen, srand(), den är väll samma i uC som i vanliga C?

//Emil
Skriv svar