Randomize med AVR?
Randomize med AVR?
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
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
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.
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.
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 ?
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.
Kod: Markera allt
#include <avr/io.h>
#include <stdlib.h>
int main(void){
DDRB = 0xff;
for(;;){
PORTB = (unsigned char) rand();
}
}
Aha! De va de ju!
Tack för hjälpen!
Men, om jag gör tex
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
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());
För ibland måste man gör saker i olika tidspunkter för att de ska fungera.
//Emil
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?!
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?!

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