Random getal
41 berichten
• Pagina 4 van 5 • 1, 2, 3, 4, 5
Re: Random getal
en als ik het tweede significante bitje pak krijg ik dit:
8: 7968
9: 7672
10: 10.724
sketch:
Ik denk dat de voorlopige conclusie moet zijn dat de analogRead niet optimaal is...
Gebruik het om de randomSeed te vullen. En laat het daar bij.
8: 16.832
9: 17.111
10: 16.724
8: 7968
9: 7672
10: 10.724
sketch:
- Code: Alles selecteren
byte WG;
void setup(){
Serial.begin(9600);
}
void loop(){
WG = ((analogRead(A0) & 2)<<1)|(analogRead(A0) & 2);
if (WG){
Serial.println(7+(WG>>1));
}
}
Ik denk dat de voorlopige conclusie moet zijn dat de analogRead niet optimaal is...
Gebruik het om de randomSeed te vullen. En laat het daar bij.
- Code: Alles selecteren
void setup(){
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop(){
Serial.println(8+int(random(3)));
}
8: 16.832
9: 17.111
10: 16.724
Advertisement
Re: Random getal
Ik ben even naar de basis teruggegaan. Dus niet een random getal tussen 0 en 2 zoeken, maar kijken hoe vaak een analoge read op A0 een even dan wel oneven resultaat geeft.
Deze sketch:
telt hoe vaak er een 1 dan wel een 0 terugkomt van een analogRead(A0)&1.
Dat blijkt geen evenredige verdeling te geven. De output is dit:
b0 = 71244
b1 = 28757
b0 = 71380
b1 = 28621
b0 = 71534
b1 = 28467
b0 = 71546
b1 = 28455
b0 = 70812
b1 = 29189
enz.
Spreekt voor zich, denk ik, en bevestigt eerdere conclusies.
Groet, Karel
Deze sketch:
- Code: Alles selecteren
long b0, b1, count;
byte result;
void setup(){
Serial.begin(9600);
count = 0;
b0 = 0;
b1 = 0;
}
void loop(){
result = analogRead(A0) & 1;
if (result == 1)
b1++;
else
b0++;
count++;
if (count > 100000)
{
Serial.print("b0 = ");
Serial.println(b0);
Serial.print("b1 = ");
Serial.println(b1);
Serial.println();
b0 = 0;
b1 = 0;
count = 0;
}
}
telt hoe vaak er een 1 dan wel een 0 terugkomt van een analogRead(A0)&1.
Dat blijkt geen evenredige verdeling te geven. De output is dit:
b0 = 71244
b1 = 28757
b0 = 71380
b1 = 28621
b0 = 71534
b1 = 28467
b0 = 71546
b1 = 28455
b0 = 70812
b1 = 29189
enz.
Spreekt voor zich, denk ik, en bevestigt eerdere conclusies.
Groet, Karel
If you think education is expensive, try ignorance! (Derek Bok)
Re: Random getal
Met een 10 maal een XoR krijg je dit: (eerst je code met mijn aanpassing, dan output)
Nu is het nog meer schijnbaar willekekreurig...
Nu is het nog meer schijnbaar willekekreurig...
- Code: Alles selecteren
long b0, b1, count;
byte result;
void setup(){
Serial.begin(9600);
count = 0;
b0 = 0;
b1 = 0;
}
void loop(){
// dit was: result = analogRead(A0) & 1;
for (int t = 0; t<10;t++){
result = result ^ (analogRead(A0) & 1);
}
if (result == 1)
b1++;
else
b0++;
count++;
if (count > 100000)
{
Serial.print("b0 = ");
Serial.println(b0);
Serial.print("b1 = ");
Serial.println(b1);
Serial.println();
b0 = 0;
b1 = 0;
count = 0;
}
}
b0 = 49612
b1 = 50389
b0 = 49613
b1 = 50388
b0 = 49995
b1 = 50006
b0 = 49982
b1 = 50019
b0 = 50293
b1 = 49708
b0 = 49872
b1 = 50129
Re: Random getal
ik heb nu de volgende code geschreven, ik zit er alleen nog aan te denken om er toch een boolean in te maken.
Maar met deze code heb ik een probleem met het random getal kiezen. Als ik de arduino aansluit dan gaan alle lampjes branden ipv een random lampje. Wat heb ik verkeerd gedaan in deze code...?
Daarbij zou ik ook graag willen weten hoe ik het random lampjes kiezen uit zet. (helemaal aan het einde van de code...)
Bedankt voor de gene die mij hier mee kan helpen
Maar met deze code heb ik een probleem met het random getal kiezen. Als ik de arduino aansluit dan gaan alle lampjes branden ipv een random lampje. Wat heb ik verkeerd gedaan in deze code...?
- Code: Alles selecteren
int Led = 8;
int Led2 = 9;
int Led3 = 10;
int DrukKnop = 7;
int DrukKnop2 = 6;
int DrukKnop3= 5;
int A;
void setup()
{
Serial.begin(9600);
randomSeed (analogRead (0));
pinMode(Led, OUTPUT);
pinMode (Led2, OUTPUT);
pinMode(Led3, OUTPUT);
pinMode(DrukKnop, INPUT);
pinMode(DrukKnop2, INPUT);
pinMode(DrukKnop3, INPUT);
}
void loop()
{
if (digitalRead(DrukKnop) == HIGH && Led == HIGH)
{
digitalWrite(Led, HIGH);
}
else
{
digitalWrite(Led, LOW);
}
if(digitalRead(DrukKnop2) == HIGH && Led2 == HIGH)
{
digitalWrite(Led2, HIGH);
}
else
{
digitalWrite(Led2, LOW);
}
if(digitalRead(DrukKnop3) == HIGH && Led3 == HIGH)
{
digitalWrite(Led3, HIGH);
}
else
{
digitalWrite(Led3, LOW);
}
A=(8+int(random(3)));
if (A == 8)
{
digitalWrite(Led, HIGH);
}
if (A == 9)
{
digitalWrite(Led2, HIGH);
}
if (A == 10)
{
digitalWrite(Led3, HIGH);
}
if(Led2) == HIGH && Led == HIGH)
{
/* stop random poorten kiezen*/
}
Daarbij zou ik ook graag willen weten hoe ik het random lampjes kiezen uit zet. (helemaal aan het einde van de code...)
Bedankt voor de gene die mij hier mee kan helpen
Re: Random getal
sorry voor bovenstaande. Autocorrectie op engels EN op telefoon typen levert weinig zinvols op.
Wat ik hierboven bedoel is dit: Nergens worden de variabelen LED, LED2, LED3 'gevuld'. Waarschijnlijk denk je dat met digitalWrite(led, HIGH); ook de variabele 'led' 'HIGH' wordt. Is dus niet zo. Moet led = 1 bij.
Wat ik hierboven bedoel is dit: Nergens worden de variabelen LED, LED2, LED3 'gevuld'. Waarschijnlijk denk je dat met digitalWrite(led, HIGH); ook de variabele 'led' 'HIGH' wordt. Is dus niet zo. Moet led = 1 bij.
Re: Random getal
Hallo allemaal, ik heb een tijdje lopen spelen met de random functie. Het is mij eindelijk gelukt om er een mooie random in te bouwen.
Maar nu het probleem, ik wil nu het spel tot een geheel krijgen. Helaas lukt dat mij niet helemaal.
Hier de code:
ik wil nu dat als de knop die op pin 4 aangesloten is in gedrukt wordt dat het hele spel begint. En als hij los wordt gelaten. Ik heb hem zo aangesloten dat hij altijd "HIGH" is ( ene kant aangesloten aan de - kant, andere kant draadje naar pin 4 en weerstandje en via weerstandje naar de +). Dus zodra hij wordt ingedrukt wordt hij "LOW" toch?
verder is te zien in de code dat ik 3 spelers heb. Ik heb alleen nog geen tijd gehad om te testen of dit werkt, misschien dat jullie nu al fouten zien, dan hoor ik dat ook graag .
Maar nu het probleem, ik wil nu het spel tot een geheel krijgen. Helaas lukt dat mij niet helemaal.
Hier de code:
- Code: Alles selecteren
/* Random LED */
// set pin numbers:
int ledPin, ledPinold, clean=true; // variabelen voor Led en initial run
int start = 4; //zorgt voor het starten van het spel
int G = 0; //controleren hoeveel spelers nog in spel
boolean(Speler1) = false;
boolean(Speler2) = false;
boolean(Speler3) = false;
void setup() {
// pennen met leds als uitgang:
for (ledPin=8;ledPin<14;ledPin++)
pinMode(ledPin, OUTPUT);
// pennen met schakelaars als input:
pinMode(4, INPUT); // start button
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
ledPin=0; // 'lege' waarde voor ledPin
}
void loop()
{
delay(400);
while(start == LOW) // startkop ingedrukt?
{
if (clean) // eerste keer uitgevoerd? dan randomseed uitvoeren
{
randomSeed(millis()%4096);
clean=false; // dirty!
}
while (ledPin==ledPinold)
ledPin=random(8,14);
digitalWrite(ledPin, HIGH);
delay(750 / random(1,5)); // debounce, wacht op uitdenderen van de schakelaar
digitalWrite(ledPin, LOW);
delay(3000 / random(1,10));
ledPin=ledPinold;
// De drukknoppen toevoegen, met acties er bij
if(digitalRead(5) == HIGH && digitalRead(8) == HIGH)
{
Speler1 = true;
G++;
}
if(digitalRead(6) == LOW && digitalRead(9) == HIGH)
{
Speler2 = true;
G++;
}
if(digitalRead(7) == LOW && digitalRead(10) == HIGH)
{
Speler3 = true;
G++;
}
if(G == 2)
{
break;
G == 0;
}
}
}
ik wil nu dat als de knop die op pin 4 aangesloten is in gedrukt wordt dat het hele spel begint. En als hij los wordt gelaten. Ik heb hem zo aangesloten dat hij altijd "HIGH" is ( ene kant aangesloten aan de - kant, andere kant draadje naar pin 4 en weerstandje en via weerstandje naar de +). Dus zodra hij wordt ingedrukt wordt hij "LOW" toch?
verder is te zien in de code dat ik 3 spelers heb. Ik heb alleen nog geen tijd gehad om te testen of dit werkt, misschien dat jullie nu al fouten zien, dan hoor ik dat ook graag .
- astrofrostbyte
- Berichten: 229
- Geregistreerd: 20 Jan 2013, 12:01
Re: Random getal
opmerkingen in //commentaar
Wat de code ook wel leesbaarder kan maken is enumeration
enum {ButtonStart=4, Button1, Button2, Button3};
dit is het zelfde als
#define ButtonStart 4
#define Button1 5
#define Button2 6
#define Button3 7
je kan dan in de code ipv 5 gewoon Button1 gebruiken : bv
pinMode(5, INPUT); wordt dan pinMode(Button1, INPUT);
if(digitalRead(5) == HIGH && digitalRead(8) == HIGH) wordt dan if(digitalRead(Button1) == HIGH && digitalRead(8) == HIGH)
- Code: Alles selecteren
int ledPin, ledPinold, clean = true; // clean is een boolean
int start = 4; // start een variable of pinnr ?
int G = 0;
boolean Speler1 = false; // haakjes () mochten hier weg
boolean Speler2 = false;
boolean Speler3 = false;
void setup() {
for (ledPin=8;ledPin<14;ledPin++)
pinMode(ledPin, OUTPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
ledPin=0;
}
void loop()
{
delay(400);
while(start == LOW) // start is niet gedefineerd door iets
{
if (clean)
{ randomSeed(millis()%4096);
clean = false;
}
// code zet een random led voor random tijd aan.
while (ledPin==ledPinold)
ledPin=random(8,14);
digitalWrite(ledPin, HIGH);
delay(750 / random(1,5));
digitalWrite(ledPin, LOW);
delay(3000 / random(1,10));
ledPin = ledPinold;
if(digitalRead(5) == HIGH && digitalRead(8) == HIGH) // digitalRead(5) == LOW ??
{ Speler1 = true;
G++;
}
if(digitalRead(6) == LOW && digitalRead(9) == HIGH)
{ Speler2 = true;
G++;
}
if(digitalRead(7) == LOW && digitalRead(10) == HIGH)
{ Speler3 = true;
G++;
}
if(G == 2)
{ break;
G == 0; // hier kom je nooit, g==0 is een vergelijking
}
}
}
Wat de code ook wel leesbaarder kan maken is enumeration
enum {ButtonStart=4, Button1, Button2, Button3};
dit is het zelfde als
#define ButtonStart 4
#define Button1 5
#define Button2 6
#define Button3 7
je kan dan in de code ipv 5 gewoon Button1 gebruiken : bv
pinMode(5, INPUT); wordt dan pinMode(Button1, INPUT);
if(digitalRead(5) == HIGH && digitalRead(8) == HIGH) wordt dan if(digitalRead(Button1) == HIGH && digitalRead(8) == HIGH)
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate
Re: Random getal
Ik heb op mijn arduino uno de ledjes aangesloten op pinnen 8 t/m 13 en de pushbuttons op 1 t/m 6 (en op 0 de startknop)
Dit is mijn code nu. Hij werkt redelijk. Maar soms als het ledje brand en ik de bijbehorende knop in druk reageert hij daar niet op. Zit er een fout in mijn code? Of ligt het gewoon aan de druk knop? Veder heb ik nog geprobeerd met een enum maar dat werkte op de een of andere manier niet?
- Code: Alles selecteren
int ledPin, ledPinold, clean = true;
int speler1 = 0; // spelers benoemen
int speler2 = 0;
int speler3 = 0;
int speler4 = 0;
int speler5 = 0;
int speler6 = 0;
int i;
int Druk1, Druk2, Druk3, Druk4, Druk5, Druk6 = 0;
int ButtonStart = 0;
int Button1 = 1; // buttons benoemen
int Button2 = 2;
int Button3 = 3;
int Button4 = 4;
int Button5 = 5;
int Button6 = 6;
void setup()
{
for (ledPin=8;ledPin<14;ledPin++)
pinMode(ledPin, OUTPUT);
pinMode(Button1, INPUT);
pinMode(Button2, INPUT);
pinMode(Button3, INPUT);
pinMode(Button4, INPUT);
pinMode(Button5, INPUT);
pinMode(Button6, INPUT);
pinMode(ButtonStart, INPUT);
ledPin=0;
}
void loop()
{
delay(1000);
while(digitalRead(ButtonStart) == HIGH)
{
if (clean)
{ randomSeed(millis()%4096);
clean = false;
}
// code zet een random led voor random tijd aan.
while (ledPin==ledPinold)
ledPin=random(8,14);
digitalWrite(ledPin, HIGH);
for( i = 0; i<=200; i++) // aantal keren dat hij moet kijken of de knoppen zijn ingedrukt, met bijbehorende ledjes
{
delay(5 / random(1,5));
if(digitalRead(Button1) == HIGH && ledPin == 8) //Controleren van de knoppen en ledjes
{ speler1 = 1;
Druk1 = 1;
}
if(digitalRead(Button2) == HIGH && ledPin == 9)
{ speler2 = 1;
Druk2 = 1;
}
if(digitalRead(Button3) == HIGH && ledPin == 10)
{ speler3 = 1;
Druk3 = 1;
}
if(digitalRead(Button4) == HIGH && ledPin == 11)
{ speler4 = 1;
Druk4 = 1;
}
if(digitalRead(Button5) == HIGH && ledPin == 12)
{ speler5 = 1;
Druk5 = 1;
}
if(digitalRead(Button6) == HIGH && ledPin == 13)
{ speler6 = 1;
Druk6 = 1;
}
}
digitalWrite(ledPin, LOW);
ledPin = ledPinold;
if(Druk1 == 1){digitalWrite(8, HIGH);} // gehaalde knoppen ledjes aanhouden
if(Druk2 == 1){digitalWrite(9, HIGH);}
if(Druk3 == 1){digitalWrite(10, HIGH);}
if(Druk4 == 1){digitalWrite(11, HIGH);}
if(Druk5 == 1){digitalWrite(12, HIGH);}
if(Druk6 == 1){digitalWrite(13, HIGH);}
delay(3000 / random(1,10));
if(Druk1 + Druk2 + Druk3 + Druk4 + Druk5 + Druk6 == 5) // einde van het spel controleren
{ speler1 = 0; // alle waarden resten
speler2 = 0;
speler3 = 0;
speler4 = 0;
speler5 = 0;
speler6 = 0;
Druk1 = 0;
Druk2 = 0;
Druk3 = 0;
Druk4 = 0;
Druk5 = 0;
Druk6 = 0;
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
break;
}
}
}
Dit is mijn code nu. Hij werkt redelijk. Maar soms als het ledje brand en ik de bijbehorende knop in druk reageert hij daar niet op. Zit er een fout in mijn code? Of ligt het gewoon aan de druk knop? Veder heb ik nog geprobeerd met een enum maar dat werkte op de een of andere manier niet?
41 berichten
• Pagina 4 van 5 • 1, 2, 3, 4, 5
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten