Forum: Mikrocontroller und Digitale Elektronik Zufalls Funktion


von Stefan W (Gast)


Lesenswert?

Hallo
Ich programmiersprache mit Bascom.
Geht das mit einem 90s2313 das  wenn man einen taster drückt
zufällig eine von vier leds leuchtet. Also irgend eine der vier Led ???
Welchen Befehl braucht man dazu ??

Kann man auch eine Wahrscheinlichkeit mit dazu bringen ??

z.b. das led 1 10%
         led 2 40%
         led 3 60%
         led 4 80%

Währe sehr dankbar für Antworten.
Danke
Stefan

von Tobi (Gast)


Lesenswert?

rnd, aber ohne gewichtung

von Tobi (Gast)


Lesenswert?

ach ja, ich mir gerad eingefallen, dass die ja problemlos selber zu
machen ist.
einfach zufallszahlen bis 100 und dann 0-20 für 20%, 21-60 für 40% usw

von Ingo Henze (Gast)


Lesenswert?

Die Gewichtung ist nich besonders schwierig, wenn man davon ausgehen
kann, das die Zufallszahlen im Wertebereich gleichverteilt sind.

- Zufallszahl z im Bereich 0 bis 99 erzeugen
- wenn z < 10 dann LED1 ein
- wenn z < 40 dann LED1 ein
- wenn z < 60 dann LED1 ein
- wenn z < 80 dann LED1 ein
- und wieder von vorn anfangen

Gruß
Ingo

von Ingo Henze (Gast)


Lesenswert?

Ooops, blödes kopieren und einfügen :-)
Naturlich nicht immer LED1 an, sondern LED2, LED3, LED4 (von oben nach
unten)

Gruß
Ingo

von Rainer (Gast)


Lesenswert?

Hallo
Sehr Interssant !!
Mich würde auch Intressieren wie so ein Code aussieht ??
Habs gerade versucht klappt bei mir überhaupt nicht.

Kann mal jemand ein Beispiel geben ??
Gruß
Rainer

von André Kronfeldt (Gast)


Lesenswert?

@Ingo Henze

Würde bedeuten: Wenn z < 10: Alle an ;-)
Man muß schon z > 10  && z < xx machen für die nächste LED.

Grüße,
André

von André Kronfeldt (Gast)


Lesenswert?

@Ingo:

Kannst aber Recht haben. Die Frage von Stefan ist ein wenig unglücklich
gewählt:

> zufällig eine von vier leds leuchtet.
Also nie > 1. Dann aber eine Gesamtwahrscheinlichkeit von > 100% (10% +
40 % + 60% + 80%) haben wollen.
Beides geht nun nicht. Aber ich sehe, daß Du Dich für Variante 2
entschieden hast. also nehm ich meine Verurteilung zurück ;-)

Grüße,
André

von Flocky (Gast)


Lesenswert?

Hallo
Tolle Aufgabe finde ich habt Ihr da.
Lösung würde auch mich Interessieren !
Werde Morgen auch mal anfangen zu coden g
Wenn jemand schon ein fertiges listing hat, könnten
wir es ja mal als Projekt verfeinern Oder ?????

Viel Spaß
Flocky

von Ingo Henze (Gast)


Lesenswert?

Wenn nie zwei oder mehr LEDs gleichzeitig an sein sollen, geht das so
natürlich nicht, wie ich es oben skizziert habe.
Eigentlich geht es dann gar nicht, denn die Summe der
Wahrscheinlichkeiten ist größer als 100%, wie auch André in seinem
zweiten Beitrag treffend bemerkt hat :-)

Nehmen wir mal den größten Wert von 80% für LED4,dann bleiben für alle
anderen LEDs ja nur noch 20%, in denen sie eingeschaltet werden sollen,
und das schafft man nur noch für LED1.

Man könnte die Verteilung wieder auf 100% runterskalieren, und mit
(gerundeten)
  5%
 21%
 32%
 42%
rechnen.

Dann klappt auch Variante 1.

Man muß halt definieren, was man will. Immer nur genau eine, oder die
gewünschte Wahrscheinlichkeit auch größer 100% in der Summe

Gruß
Ingo

von André Kronfeldt (Gast)


Lesenswert?

@Ingo:

> Man muß halt definieren, was man will. Immer nur genau eine, oder
die
> gewünschte Wahrscheinlichkeit auch größer 100% in der Summe
Sag ich doch.

Aber solange keine genaue Frage gestellt wird, kann man auch keinen
Code erstellen. Obwohl Deine Erklärung und die anderen Beiträge
eigentlich Hilfe genug sind.

Grüße,
André

von Ingo Henze (Gast)


Lesenswert?

Da fällt mir ein, was unser Dr. Richlowsky immer gesagt hatte, bei dem
wir in die Geheimnisse der Assemblerprogrammierung eingeweiht wurden:

"Wenn man sich die Mühe macht, die Frage erstmal ordentlich zu
formulieren, kommt man manchmal dabei bereits selbst auf die Antwort
(Lösung)"

Sinngemäß oder so ähnlich.
Da ist wohl was dran :-)

Gruß
Ingo

von Florian Scharf (Gast)


Lesenswert?

Interessant ist eher die Erzeugung der Zufallszahlen, das wird ne runde
kniffliger als die LEDs leuchten zu lassen. Haste das denn überhaupt
schon gelöst?

der Flo

von Matthias (Gast)


Lesenswert?

Hi

also für die Anwendung dürfte ein PRNG völlig ausreichend sein.

Matthias

von Florian Scharf (Gast)


Lesenswert?

Sicher, aber der muss auch erstmal programmiert ("copy+paste"ed)
werden. ;)
Und schliesslich hat er nach einem Befehl dafür gesucht, und was ich
damit sagen wollte ist, dass ich ihn darauf hinweisen wollte dass es
bei µCs i.A. keine random() Funktion gibt.

greetings, der Flo

von Leo (Gast)


Lesenswert?

Hallo hat denn schon jemand einen Funktionierenden Basic Code ??
Würde mich auch dem Projekt zuordnen wollen.
Habe allerdings keine Ahnung wie man da beginnen könnte.

LEO

von Stefan W (Gast)


Lesenswert?

Hallo Danke erst mal an Euch alle.
Sorry das mit meiner % verteilung wahr wohl mist.

Nehmen wir mal als Neue % Werte

 das     led 1  5%
         led 2 20%
         led 3 25%
         led 4 50%
---------------------------
  gesamt   =  100%

Frequenz 4 Mhz
Taster auf PD1 (aktiv wenn High)
Led 1  auf PB1
Led 2  auf PB2
Led 3  auf PB3
Led 4  auf PB4

Schön währe noch ein lauflicht wie eine auslosung bis nur noch eine Led
an ist.
Led bleibt solange an bis der Taster nochmal gedrücht wird.

Leider finde auch ich den anfangsfaden nicht so richtig.

Für Beispiele bin ich sehr Dankbar.

(Das Teil soll überigens der gag auf unserer Halloween Party am 31.
werden Wobei
led 1  dann z.b. 2cl Jack Daniels trinken muß
led 2  dann z.b. 2cl Jägermeister trinken muß
usw...
Ist doch eine Gute Idee um für Stimmung zu sorgen oder ???ß

Gruß
Stefan W

von anfänger (Gast)


Lesenswert?

quasi russisch-roulette mit hochprozentigem wo man garantiert immer
"verliert"?! hört sich gut an ;-)

von anfänger (Gast)


Lesenswert?

Dim I As Byte

Do
Debounce Pind.1 , 1 , Zufall , Sub
Loop

Zufall:
Do
  I = Rnd(100)   'get random number from 0-99
  Select Case I
   Case 0 To 4 : Portb = &B0100000
   Case 5 To 24 : Portb = &B0010000
   Case 25 To 49 : Portb = &B0001000
   Case 51 To 99 : Portb = &B0000100
  End Select
Loop

Pausen und blinken und sowas kannste ja selbst einbauen...

von anfänger (Gast)


Lesenswert?

ah fehler: das do..loop in der zufall-subroutine muss weg und am schluß
muss ein return hin!

von Tobi (Gast)


Lesenswert?

@florian:
"Und schliesslich hat er nach einem Befehl dafür gesucht, und was ich
damit sagen wollte ist, dass ich ihn darauf hinweisen wollte dass es
bei µCs i.A. keine random() Funktion gibt. "

gibts auch bei anderen systemen in der regel nicht, alles nur pfusch :)

von Stefan W (Gast)


Lesenswert?

Hay anfänger
Vielen Dank
Denkst Du das es wirklich so einfach geht ??
Werde es heute abend gleich mal probieren.
Bin gerade beim Hardware zusammenbauen.
Wenns klappt gebe ich hier nochmal gleich bescheid.
Und das Ergebnis von der Party werde ich Euch nach dem Härtetest
auch noch mitteilen.
Freue mich schon das Ding zu testen.

Danke an alle

Gruß
Stefan Weiß

von Stefan W (Gast)


Lesenswert?

Hallo
Funktioniert schon sehr Gut.

Aber hier noch das Problem
Wenn die erste zahl generiert wird dann kommt immer die Zahl 49
Also strom aus und ein , dann Taster Pind.1 das erste mal kommt
immer 49 kann man da vieleicht was dran ändern ????
Gibt es da eine bessere lösung für das Lauflicht bei der ziehung ???

Gruß
Stefan






$regfile = "2313def.dat"
$crystal = 4000000
Config Portb = Output
Portb.5 = 0
Config Pind.1 = Input
Dim Z As Byte

Do
Debounce Pind.1 , 1 , Generator , Sub
Loop

Generator:
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Wait 1
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Waitms 100
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Portb.4 = 0
Waitms 100
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 0
Waitms 100
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Waitms 300

Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 1
Waitms 100
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Portb.4 = 1
Waitms 100
Portb.1 = 0
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Waitms 100
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Waitms 200
Portb.1 = 1
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Waitms 100
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Portb.4 = 0
Waitms 100
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 0
Waitms 100
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Waitms 300

Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 1
Waitms 100
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Portb.4 = 1
Waitms 100
Portb.1 = 0
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Waitms 100
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Waitms 200
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0


Z = Rnd(100)
Select Case Z
Case 0 To 4 : Goto 1
Case 5 To 24 : Goto 2
Case 25 To 48 : Goto 3
Case 49 To 99 : Goto 4
End Select
Return


1:
Portb.1 = 1
Return

2:
Portb.2 = 1
Return

3:
Portb.3 = 1
Return

4:
Portb.4 = 1
Return

von Heinz (Gast)


Lesenswert?

Hay
Gib hald einfach einen festen startwert vor der sogenannten
zufallsauswahl an.
Lauflicht einfach mit bit verschiebung weiß aber auch nicht genau wie.

machs besser
ist aber eine lustige idee.

von anfänger (Gast)


Lesenswert?

Wenn du timer0 ansonsten nicht brauchst, kannst du hiermit eine nahezu
zufällige zahl erzeugen:

$regfile = "2313def.dat"
$crystal = 4000000
Config Portb = Output
Portb.5 = 0
Config Pind.1 = Input
Dim Z As Byte
Dim ___rseed As Word

Config Timer0 = Timer , Prescale = 1
Enable Timer0
Start Timer0

Do
Debounce Pind.1 , 1 , Generator , Sub
Loop

Generator:

'Blink-Blink...

Portb = 0

___rseed = Timer0
Z = Rnd(100)
Select Case Z
Case 0 To 4 : Portb.1 = 1
Case 5 To 24 : Portb.2 = 1
Case 25 To 48 : Portb.3 = 1
Case 49 To 99 : Portb.4 = 1
End Select
Return

zur erklärung von ___rseed: guck dir mal in der bascom-hilfe die
RND-erklärung an.

ps: das mit dem blinken geht um einiges schöner und kürzer ;-) aber wir
haben ja alle mal so angefangen...

von Stefan W (Gast)


Lesenswert?

Hey danke SUPER
Jetzt klappt es wirklich Super ...
Haben uns heute schon mal ein bisschen mit dem Ding gespielt
macht wirklich spaß.
Nur das lauflicht ist wirklich nicht der Hit.

Den rseed befehl werde ich mir heute abend mal reinziehen.

Das mit dem Lauflicht und blinken usw.... würde mich noch Interessieren
wie man das besser und schöner machen kann ?
Macht man das normal mit Bit manipulation ???


P.S.
Hab übrigens schon einiges dazugelernt, dank Eurer Hilfe
Hab mir gerade das Bascom Buch bestellt, mal sehen ob mir das
was bringt.
Mir kommt es so vor das ich es am einfachsten mit kleinen Beispielen
(Aufgaben) erlernen kann.

Also werde ich mich als nächstes an so ein Lauf und blinklicht
setzen.


Danke nochmal
Stefan

von anfänger (Gast)


Lesenswert?

bitte...

wegen dem lauflicht: guck dir mal die shift und rotate befehle in
bascom an. kombiniert mit einer for-schleife oder "do..loop until"
könnte man das ganze etwas kompakter gestalten.

btw: ___rseed ist kein befehl sondern ne art variable, in der die
"startzahl" steht, die die rnd-funktion in bascom nutzt.

von Jens123 (Gast)


Lesenswert?

hi
wieso sist das denn so schwer??

Variante1:
lass einen timer laufen.
nim einen entprellten taster
drueck den taster
liess das zaehlerregister aus
dann hast du schonmal eine zufallszahl..
das register sollte fo schnell uebergeflossen sein, dass du nicht sagen
kannst wann es in etwa bei 0 , 1 , 2, ,3 ... ist
nun hast du eine zahl
und der timer zaehlt bis 5000 (angenommen)
dann kannst du wenn die zahl zwichen 0 ... 500 ist die erste LED an
machen
ist die Zahl zwichen 501 .... 3000 machst die 2te an und so weiter
je groesser der unterschied ist zwichen der ersten und 2ten zahl um so
groesser ist die warscheinlichkeit, dass der timer da gerade zum
zeitpunkt drin ist, wenn du den taster drueckst

im grunde ganz einfach

evtl. solltest du mit asm anfanngen empfehle ich jedem der sich in die
welt der µCs einarbeiten will

Gruss Jens

von anfänger (Gast)


Lesenswert?

ja stimmt. man könnte das random jetzt eigentlich auch ganz weglassen
und nur den wert des timers als "zufallszahl" nutzen.

von Heinz (Gast)


Lesenswert?

Hallo Jens123
Das verstehe ich jetzt nicht wie man das umsetzen kann.
Kannst Du da mal ein beispiel zeigen ?
Währe echt interessant.

Merci
Heinz

von Jens123 (Gast)


Lesenswert?

Nope =)
Streng dein Hirn an, dann schaffst du es auch
Timer0 zaehlt immer weiter
Du definierst die 4 Zahlenbereiche fuer deine LEDs vergleichst diese
mit dem timer und schaltest die led
Ganu einfach

von Stefan W (Gast)


Lesenswert?

Hallo anfänger (obwohl Du sicher keiner bist)
Danke das mit dem lauflicht mit den shift und rotate befehlen habe ich
super hinbekommen. Habs sogar noch verfeinert mit einem zweiten
zufallsgenerator der dann verschiedene Lichteffekte (unterprogramme)
ablaufen lässt.
Jetzt kann sich das ding echt sehen lassen.
Ist ja fast ein Effektlicht mit zusatzfunktion geworden.

Danke hast mir sehr geholfen !!!

von anfänger (Gast)


Lesenswert?

bitte bitte...hab ich doch gern gemacht ;-)

mittlerweile bin ich vielleicht wirklich kein anfänger mehr, aber vom
profi noch weit entfernt. im vergleich mit gewissen anderen leuten hier
im forum ist der name bestimmt noch zutreffend :-)

von Klaus Ertl (Gast)


Lesenswert?

Hallo
Das teil muß ich auch haben.
Habt Ihr denn die Hardware auch schon fertig ??
Wenn ja hätte ich auch gerne den schaltplan.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.