Random functie

Hoe maak ik een Random functie, zodat er één van de 8 uitgangen willekeurig hoog wordt.

MVG
Bert

http://en.wikipedia.org/wiki/Pseudorandom_number_generator

gebruik die middle square, lijkt me goed te zijn. Wat wil je juist doen?

[Bericht gewijzigd door stecj366 op 23 oktober 2008 15:21:51 (40%)]

Sonar is meer dan Ping...
Henry S.

Moderator

Op 23 oktober 2008 15:18:16 schreef Bert DS:
Hoe maak ik een Random functie, zodat er één van de 8 uitgangen willekeurig hoog wordt.

Licht die vraag eens toe, nu is die op nivo van "hoe maak ik een auto?"

73's de PA2HS - ik ben een radiohead, De 2019 CO labvoeding.

Ik wil 8 Drukknoppen met elk een led, er zou één led willekeurig moeten oplichten. Op de bijhorende drukknop moet je zo vlug omgelijk drukken en er moet direct een andere willekeurige led oplichten waar je ook zo rap mogelijk op moet drukken enz...

MVG
Bert

Het gemakkelijkst is om de ADC te gebruiken als bron van ruis. Als je een draadje aan de ADC pin maakt die je vrij laat hangen, krijg je waarschijnlijk wel genoeg "rommel" om daar 3 bits van te kunnen pakken. Eventueel kun je meerdere samples nemen om 3 "willekeurige" bits te krijgen.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
High met Henk

Special Member

ruis is niet erg random..... probleem is nl dat het 0 niveau van de ruis (even bot gezegd ruw het gemiddelde) vaker is als de omliggende warden, hoe verder hoe minder vaak: standaard normale verdeling ofzo?

echt random is lastig.

to all newbies: RTFM/D of google eens (p.s. RTFM/D = Read the f*cking manual/datasheet).

Pseudo random is hier wel goed genoeg.
Waarin programmeer je? Want de meeste talen hebben wel de een of andere random functie.

Ik programmeer in basic. microcontroller ATmega88

MVG
Bert

In mijn beleving bestaat random niet. Het is namelijk nooit "willekeurig".
Maar goed, in sommige programeertalen is dit idd erg eenvoudig.
Je kan evt ook iets berekenen de systeemtijd (adhv de secondetikker).

Succes

zoeken op randomize() (initialiseert de fuctie random) en rnd.

Ik neem aan dat je de tijd ook meet die tussen het drukken van de knoppen zit?? In de vorm van een spelletje wie de snelste reactiesnelheid heeft..

Die tijd zal, zeker in msec of nog lager 'altijd' verschillend zijn. Neem die tijd en schrijf daar een functie voor om dat om te zetten naar 1 tm 8. Wel beetje omslachtig maar wel random lijkt mij.

Of random al dan niet bestaat, is al lange tijd onderwerp van discussies.

"God does not play dice!", zei Einstein.

"Not only does God play dice, he sometimes throws them where they can't be seen", aldus Steven Hawking.

Het lijkt er sterk op dat "toeval" wel bestaat in de quantum mechanica. Voor de meeste praktische toepassingen is het echter voldoende om grootheden te meten welke nagenoeg onmogelijk zijn om te voorspellen.

Een eenvoudig voorbeeld is een camera met lenskap. Deze zal geen perfect zwarte pixels produceren, maar kleine kleurwaarden als gevolg van allerlei vormen van straling, thermische effecten, enz. Deze meetwaarden blijken een zeer hoge mate van wanorde te bevatten, en zijn als zodanig bruikbaar voor cryptografische toepassingen.

Eigenlijk is elke meting bruikbaar, zolang de resolutie van het meetinstrument maar significant groter is dan het ruis niveau. Als je dan alle informatie die in de buurt van het ruis niveau komt weggooit, houd je alleen de zeer moeilijk voorspelbare ruis over. Dit kun je doen door een draad aan de ADC van een controller te maken, zodat deze wat meer storing oppikt van de omgeving, en vervolgens alleen de laagste 1 of 2 bits van de meting te gebruiken, zolang de meetwaarde maar varieert over ruimschoots meer dan 4 punten. Voor serieuze cryptografie zal het natuurlijk iets ingewikkelder worden.

EDIT: nee hoor, gewoon tijd % 8 (modulo operator). Geen mens kan op de milliseconde nauwkeurig iets timen.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Hoeft niet heel omslachtig te zijn. Start bij het opstarten van de µC een 8-bit timer met clock prescaler 1. Iedere keer de gebruiker een knop indrukt doe je deze berekening (pseudo code):

code:

next led = (count_value & 0x07) + 1;

Dit zal elke keer er op de knop gedrukt wordt een random waarde geven tussen 1 en 8. (count_value is de huidige waarde van de teller)
Als je direct een waarde wil om naar de output te sturen kan je dit doen.

code:

output = 2^(count_value & 0x07);

edit: er stond complete onzin in de formule :)

[Bericht gewijzigd door Miyagi op 23 oktober 2008 16:56:49 (12%)]

Een processor kan nooit willekeurig zijn. Gelukkig maar.
Dus "pseudo". Ik heb een testje gedaan met een pseudo-randomgenerator (JAL). Die kun je wel een 'seed' geven om um te initialiseren, maar het blijft een vast patroon, want een algorithme.
Dus, hoe zorg ik er nu voor dat de generator niet telkens hetzelfde doet? Een "echte" random input of iets dat haast niet kan worden onderscheiden.
Echte random is bv een AD-waarde van een nader te bepalen sensor, bijvoorbeeld een LDR.
Of de laatst gegenereerde waarde als 'seed' nemen, of in EEprom opslaan en de volgende keer als 'seed'.
Wat BobbyT al zegt: je ook kunt doen is gebruikersinteractie, dus de tijd tussen de knoppen, om de generator te starten.
Of een combinatie van...

Houd er rekening mee dat een randomfunctie ook een 0 kan afgeven, dus geen ledje!

Just find out what you like and let it kill you

Op 23 oktober 2008 16:48:43 schreef hadv: Houd er rekening mee dat een randomfunctie ook een 0 kan afgeven...

0..7 is ook 8 mogelijkheden.

Volgend project: domotica met USB en RS-485...

Wat ik doe, is dit:

De ADC draait in free-running mode, met ADC-interrupt enabled.
Tussen de ADC-pin en Vcc zit een R van 100k.
Tussen dezelfde pin en GND zit een diode in sperrichting (zo ruist ie lekker).
De ADC-interrupt-routine schuift de bits van een globale variabele 1 plaats naar links, en maakt diens bit0 hoog, als bit0 v/d ADC hoog is.

Als de main-routine een random getal nodig heeft, neemt hij gewoon bovengenoemde variabele.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Voor deze toepassing lijkt mij de gewone pseudo random generator voldoende. Dat is RND(0) volgens mij.

Nog een aardige, hoe weet je dat je random generator voldoende random is ? Dus
a. onvoorspelbaar
b. alle waardes worden met dezelfde kans gegenereerd.

Ik ben er klaar mee voor
Henry S.

Moderator

Op 23 oktober 2008 16:03:45 schreef Bert DS:
Ik programmeer in basic. microcontroller ATmega88

Dat was dus info voor in je startpost.

Op 23 oktober 2008 15:30:25 schreef Bert DS:
Ik wil 8 Drukknoppen met elk een led, er zou één led willekeurig moeten oplichten. Op de bijhorende drukknop moet je zo vlug omgelijk drukken en er moet direct een andere willekeurige led oplichten waar je ook zo rap mogelijk op moet drukken enz...

Een extra random vertraging tussen indrukken en een volgende willekeurige led verhoogt het speeleffect.

Gemakkelijk te doen in Basic, inclusief scorelijst en stats via een LCD.

Echt random is het niet, maar toch kan je leuke resultaten met een simpel random commando krijgen:

http://www.uploadarchief.net/files/download/128x64%20glcd%20random.jpg

73's de PA2HS - ik ben een radiohead, De 2019 CO labvoeding.

@Sponcebert: Ik vrees dat RND(0) steeds hetzelfde getal zal opleveren. RND() zal het beter doen.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Frederick E. Terman

Golden Member

Op 23 oktober 2008 17:04:23 schreef pros:
Tussen de ADC-pin en Vcc zit een R van 100k.
Tussen dezelfde pin en GND zit een diode in sperrichting (zo ruist ie lekker).

Wat voor diode gebruik je pros? Van een zener krijg ik maar een paar microvolt (genoeg voor ontvangermetingen, dat wel). Een gewone diode blijft hier gewoon dicht en slaat niet door..

Keramisch, kalibratie, parasitair: woordenlijst.org

Op 23 oktober 2008 17:04:23 schreef pros:
Wat ik doe, is dit:

De ADC draait in free-running mode, met ADC-interrupt enabled.
Tussen de ADC-pin en Vcc zit een R van 100k.
Tussen dezelfde pin en GND zit een diode in sperrichting (zo ruist ie lekker).
De ADC-interrupt-routine schuift de bits van een globale variabele 1 plaats naar links, en maakt diens bit0 hoog, als bit0 v/d ADC hoog is.

Als de main-routine een random getal nodig heeft, neemt hij gewoon bovengenoemde variabele.

Zou je niet beter het schuiven ook afhankelijk maken van de ruis? Zo ga je nog meer randomness introduceren. Nu is het altijd ofwel *2+1 of *2 dat je je globale var incrementeerd. Hier zou wel eens periodiciteit kunnen ontstaan.

Hang anders eens een AC gekoppelde versterker aan die pin, en versterk die ruis een aantal keer, zodat je meer bits van de AD bestrijkt.

Sonar is meer dan Ping...

Op 23 oktober 2008 18:30:37 schreef Frederick E. Terman:
[...]Wat voor diode gebruik je pros? Van een zener krijg ik maar een paar microvolt (genoeg voor ontvangermetingen, dat wel). Een gewone diode blijft hier gewoon dicht en slaat niet door..

Een simpele 1N4148. De spanning op het knooppunt zit ergens tussen 2 en 3V - daar zal de ingangsimpedantie v/d ADC wel voor iets tussenzitten, denk ik.

@stecj366: Je kan uiteraard allerlei toestanden verzinnen om nog meer randomness te bekomen. De ADC op een snellere klok laten lopen dan hetgeen de fabrikant aanraadt bv.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)