Random getal
41 berichten
• Pagina 2 van 5 • 1, 2, 3, 4, 5
Re: Random getal
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 .
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 .
Advertisement
Re: Random getal
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:
Geeft deze output bij mij:
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:
geeft deze output:
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.
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.
- astrofrostbyte
- Berichten: 229
- Geregistreerd: 20 Jan 2013, 12:01
Re: Random getal
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 ?
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
Re: Random getal
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?
Volgens mij komen 0 - 255 even vaak voor als alle andere getallen.
Misschien een theroretisch natuurkunbdige onder ons?
Re: Random getal
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?
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)
Re: Random getal
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 //
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 //
Re: Random getal
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?
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?
Re: Random getal
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...
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...
Re: Random getal
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.
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;
}
41 berichten
• Pagina 2 van 5 • 1, 2, 3, 4, 5
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten