Random getal

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

Re: Random getal

Berichtdoor pjh » 08 Mrt 2013, 23:09

en als ik het tweede significante bitje pak krijg ik dit:
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

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

Re: Random getal

Berichtdoor Karel » 10 Mrt 2013, 14:35

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:

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)

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

Re: Random getal

Berichtdoor pjh » 10 Mrt 2013, 18:24

:D Denk dat we dit onderwerp tot op de bodem hebben uitgezocht Watson!
Helemaal goed. :P

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

Re: Random getal

Berichtdoor pjh » 10 Mrt 2013, 23:32

Met een 10 maal een XoR krijg je dit: (eerst je code met mijn aanpassing, dan output)
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


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

Re: Random getal

Berichtdoor Dedier » 14 Mrt 2013, 09:46

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...?
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 :D

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

Re: Random getal

Berichtdoor pjh » 14 Mrt 2013, 13:25

De varabele LED, led1 etc, worst niet high met been digital write. Most led=1 bij.

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

Re: Random getal

Berichtdoor pjh » 14 Mrt 2013, 18:44

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.

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

Re: Random getal

Berichtdoor Dedier » 21 Mrt 2013, 16:40

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:
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 :D .

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

Re: Random getal

Berichtdoor astrofrostbyte » 21 Mrt 2013, 22:01

opmerkingen in //commentaar
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

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

Re: Random getal

Berichtdoor Dedier » 29 Mrt 2013, 13:46

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)

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?

VorigeVolgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten