Hallo,
vielen Dank für eure guten Tipps!
Großen Dank auch an den Verfasser des Zufallsgenerators!
Hier mal ein kleines Programm, in dem die beiden Methoden "Bereich" und "Gauss" verwendet werden.
Die StatusLED soll mit der Wahrscheinlichkeit von ca. 10% aus sein,
mit der Wahrscheinlichkeit von ca. 20% gelb leuchten,
mit der Wahrscheinlichkeit von ca. 30% rot leuchten,
mit der Wahrscheinlichkeit von ca. 40% grün leuchten.
Gleichzeitig sollen die BackLEDs mit jew. 25% Wahrscheinlichkeit aus, links an, rechts an oder beide an sein.
Die jeweilige Dauer soll zwischen 0 und 2 sec. liegen mit einer Häufung um 1 sec. rum.
Soweit ich das beurteilen kann, scheint es auch zu klappen.
Gruss
M.
Code:
/***************************************************************************
* zufall LED *
***************************************************************************/
#include "asuro.h"
int i; //zähler
unsigned int data[2]; //odo
unsigned int zuf; //zufall
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//
// uint8_t zufall()
//
// Liefert eine 8Bit Pseudozufallszahl zurück,
// die Zahlenfolge wiederholt sich spätestens nach 65535 Aufrufen
//
uint8_t zufall()
{
static uint16_t startwert=0x0AA;
uint16_t temp;
uint8_t n;
for(n=1;n<8;n++)
{
temp = startwert;
startwert=startwert << 1;
temp ^= startwert;
if ( ( temp & 0x4000 ) == 0x4000 )
{
startwert |= 1;
}
}
return (startwert);
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
uint8_t zufallodo()
{
static uint16_t startwert=0x0AA;
uint16_t temp;
uint8_t n;
for(n=1;n<8;n++)
{
temp = startwert;
startwert=startwert << 1;
temp ^= startwert;
if ( ( temp & 0x4000 ) == 0x4000 )
{
startwert |= 1;
}
}
BackLED(OFF,OFF);
OdometrieData(data); // aktuelle Helligkeitswerte der
startwert^= data[0];
return (startwert);
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
int main(void)
{
Init();
// 3 sec "Anfangs-Zufallszahl"
StatusLED(OFF);
BackLED(OFF,OFF);
for(i=1;i<100;i++)
{
zuf = zufallodo();
Msleep(10);
}
Msleep(2000);
while (1)
{
StatusLED(OFF);
BackLED(OFF,OFF);
//bereich
zuf = zufall(); // Zufallszahlen zw. 0 und 255
if ( zuf < 25 ) // ca. 10% aus
{
StatusLED(OFF);
}
else if ( (zuf >= 25) && (zuf < 75) ) // ca. 20% gelb
{
StatusLED(YELLOW);
}
else if ( (zuf >= 75) && (zuf < 150) ) // ca. 30% rot
{
StatusLED(RED);
}
else if ( zuf >= 150 ) // ca. 40% grün
{
StatusLED(GREEN);
}
//bereich
zuf = zufall(); // Zufallszahlen zw. 0 und 255
zuf = zuf / 64; // Zufallszahlen zw. 0 und 3
if ( zuf == 0 ) // 25% beide aus
{
BackLED(OFF,OFF);
}
else if ( zuf == 1 ) // 25% links an - rechts aus
{
BackLED(ON,OFF);
}
else if ( zuf == 2 ) // 25% links aus - rechts an
{
BackLED(OFF,ON);
}
else if ( zuf == 3 ) // 25% beide an
{
BackLED(ON,ON);
}
// "gauss" dauer zwischen 0 und 2 sec mit häufung um 1 sec
for(i=1;i<=10;i++) // zahlen von 0 bis 2550
{
zuf = zuf + zufall();
}
zuf = (zuf * 4); // zahlen von 0 bis 10200
zuf = (zuf / 5); // zahlen zw 0 und 2040
Msleep(zuf);
}
while (1);
return 0;
}
Lesezeichen