Random getal

algemene C code
Berichten: 21
Geregistreerd: 27 Feb 2013, 15:17

Re: Random getal

Berichtdoor Dedier » 04 Mrt 2013, 01:08

Ik heb nu de sketch astrofrostbyte geprobeerd op te zetten. Die werkte wel, alleen na een paar keer zie je de volgorde van de lampjes. Wat opzich jammer is want zo weet je na 5 minuten spelen het hele uit je hoofd.

ik heb nu ook de sketch van pjh proberen te begrijpen alleen wat je daar zegt snap ik nog niet helemaal... (nog niet helemaal thuis in de wereld van techniek haha xD). Dus als je daar nog nader uitleg bij zou kunnen geven graag :D.

Advertisement

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Random getal

Berichtdoor pjh » 04 Mrt 2013, 20:19

Om een willekeurig getal te krijgen, heb je een willekeurig fenomeen nodig.
Wat ik begrijp is dat meestal de interne klok - lees hoe 'willekeurige' lang de micro controller al loopt - wordt gebruikt.
Zonder reset krijg je dus steeds de zelfde willekeurige reeks.

Wat ik gedaan heb, is een ander willekeurig fenomeen gebruikt. Namelijk het 'floaten' van een niet verbonden analoge pin.
Deze sketch:
Code: Alles selecteren
void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.println(analogRead(A0));
}

Geeft deze output bij mij:
237
262
296
269
236
269
298
260
235
276
297
251
239
282
292
247
243
288
286
242
248
293
281
238
256
295
272
236
264
297
265
235
272
298
256
237
278
294
249
240
284...
281


De waarde is 10 bits, dus tussen de 0 en de 1023. Maar 'mijn' analoge pin zwabbert zo rond de 270.
Vervolgens maak ik de aanname, dat er willekeurig even en oneven getallen komen. Preciezer: dat het minst significante bitje van de 10 bits ADC-waarde ( de analogRead ), willekeurig voorbij komt.

Van deze willekeurige bitjes, maak ik een groter getal, door ze achter elkaar te plakken. Ik tel het volgende bitje bij een getal op, door hem één plek verder naar links te zetten ( voorbeeld: 1<<4 : dit betekent: schuif een 1, 4 plaatsen naar links.
Als ik zo 8 bitjes op een rij heb, heb ik een byte.
Hoe meer bitjes ik aan elkaar rijg, hoe groter het willekeurige getal.

Deze sketch:
Code: Alles selecteren
byte willekeurigGetal;
byte tussenStap;

void setup(){
  Serial.begin(9600);
}

void loop(){
  // loop van 8 bits om een byte te maken
  for (int i = 0; i < 8; i++){
    // eerst de laatste 1 of nul pakken
    tussenStap = analogRead(A0) & 1;
    // Nu deze 0 of 1 opschuiven (NB: een nul blijft natuurlijk nul)
    tussenStap = tussenStap << i;
    // bij eindresultaat optellen
    willekeurigGetal = willekeurigGetal | tussenStap;
  }
  Serial.println(willekeurigGetal);
  // Byte weer leeg maken voor volgende ronde
  willekeurigGetal = 0;
}

geeft deze output:
171
150
201
102
70
109
207
153
90
140
47
130
67
149
182
194
0
133
221
151
46
170
144
65
194
170
1
202
183
26
43
236
83
190
85
152
166


NB.: Ik maak handig gebruikt van zogenaamde Bitwise Operators, zoals:
& (bitwise and) | (bitwise or) ^ (bitwise xor) ~ (bitwise not) << (bitshift left) >> (bitshift right)

Vervolgens heb ik de sketch even laten lopen en 32.000 willekeurige getallen in een excel sheet op volgorde gezet. Wanneer elk getal tussen 0 en 255 (8 bits) even vaak voorkomt, zou onderstaande grafiek recht moeten zijn. Maar er zitten twee "zwabbers" in, die aangeven dat bepaalde getallen vaker voorkomen dan anderen: dus zelfs dit is niet 100% willekeurig.

Hoop dat het iets duidelijker is nu.

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Random getal

Berichtdoor pjh » 04 Mrt 2013, 20:20

vergeten: nieuwe grafiek (y-as: waarde 0 - 255, x-as: de volgorde plek in excel;.
Afbeelding

Gebruikers-avatar
Berichten: 229
Geregistreerd: 20 Jan 2013, 12:01

Re: Random getal

Berichtdoor astrofrostbyte » 06 Mrt 2013, 21:00

:shock: he, moest het ff 2x lezen, maar je maakt van het LSB ruisbitje een 8bits 'seed' voor je randomgenerator.
Maar als je dit seed byte heel vaak aanmaakt dan komen niet alle waarden 0..255 evenveel voor.
is wel cool ..
Welke resultaten had je na je A0 fix ?
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Random getal

Berichtdoor pjh » 07 Mrt 2013, 08:46

Na A0 FIX wkam bovenstaande tabel. Dus afname vd fout. Maar nog niet 100%
Volgens mij komen 0 - 255 even vaak voor als alle andere getallen.
Misschien een theroretisch natuurkunbdige onder ons?

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: Random getal

Berichtdoor Karel » 07 Mrt 2013, 11:43

Misschien nog steeds te weinig samples (wet van de grote getallen)?
Of is het herhaalbaar, met andere woorden, komen de afwijkingen steeds in dezelfde resultaten voor?
Wat gebeurt er als je dezelfde sketch op een andere Arduino uitvoert?
If you think education is expensive, try ignorance! (Derek Bok)

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Random getal

Berichtdoor pjh » 07 Mrt 2013, 11:58

Ben nu op werk, kan niets testen, maar ga zeker je idee implementeren: vaker doen en ook andere arduino.

Ik vermoed dat de afwijking (2 x kleine zwabber in grafiek) te maken heeft met de ADC zelf. Soort afrondingsfout, die in de statistieken terugkomen.

Wat ik ook ga doen, is niet het laatste (LSB) bitje pakken, maar de volgende regel:
als analogRead > vorige analogRead, dan 1, anders 0

Verder zal ik ook mijn geiger buis aansluiten: dit is ECHT een willekeurig fenomeen (cosmische en aardstraling, moment van atomair verval is voorspelbaar gegeven'. Kun je super random generator van maken.

// wordt vervolgd //

Berichten: 21
Geregistreerd: 27 Feb 2013, 15:17

Re: Random getal

Berichtdoor Dedier » 08 Mrt 2013, 17:28

Ik heb geprobeerd een makkelijke code te schrijven voor mijn "spel" maar tot nu toe wilt dat nog niet echt lukken.
ik wil wel graag de "random" generator gebruiken door de analoge poort te gebruiken alleen mij wilt dit niet echt lukken, dat omdat ik C nog niet zo goed beheers.
mijn idee was dus de analoge poort te gebruiken om een getal te krijgen. dat getal moet dan om gezet worden naar een 8,9 of 10 (de poorten waar de ledjes op aan gesloten zitten) ik heb ergens iets gelezen met het getal wat ik uit de analoge poort krijg maal %3+8 kan dit kloppen. En zo ja zou iemand mij kunnen helpen deze code te schrijven?

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Random getal

Berichtdoor pjh » 08 Mrt 2013, 21:13

Mijn 'random-generator' staat arbitrair op 8 bits, dus 0 - 255
Als je nu die 8 in de sketch veranderd in 2, dan krijg je 2 bits, dus 0, 1 of 2. Tel hier 8 bij op, en je hebt je poort 8, 9 en 10 willekeurig.

Ik zal er een sketch van maken...

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Random getal

Berichtdoor pjh » 08 Mrt 2013, 21:21

In tegenstelling tot vorige bericht, zet ik je poorten in een array.
WillekeurigGetal gaat van 0 naar 2. Dit wordt dan POSITIE 0, 1 of 2 in de ARRAY poort[].
Wat resulteert in 8, 9 of 10.

Code: Alles selecteren
byte willekeurigGetal;
byte tussenStap;

int poort[] = {8, 9, 10};

void setup(){
  Serial.begin(9600);
}

void loop(){
  for (int i = 0; i < 2; i++){
    tussenStap = analogRead(A0) & 1;
    tussenStap = tussenStap << i;
    willekeurigGetal = willekeurigGetal | tussenStap;
  }
  Serial.println(poort[willekeurigGetal]);
  willekeurigGetal = 0;
}

VorigeVolgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten