HC-SR04 - Arduino soll random entscheiden ob links oder rechts

#include <AFMotor.h>
#include <Arduino.h>
#include <HCSR04.h>

byte triggerPin = 9;
byte echoPin = 10;
int duration, distance;
int number;
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
void setup() {
  Serial.begin(9600);

}

void loop() {
  motor1.setSpeed(120);
  motor2.setSpeed(120);
  motor3.setSpeed(120);
  motor4.setSpeed(120);
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
  switchdrive();
}


void switchdrive(){
 distance=0;
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(4);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  distance = round(duration * .0343) / 2;
  Serial.print("Distance: ");
  Serial.println(distance);
  delay(100); 
  switch (distance){
    case 1 ... 15:        car_front();Serial.println("zurueck");delay(1500);drive();Serial.println(number);break;
    case 16 ... 30:       motor1.setSpeed(90);motor2.setSpeed(90);motor3.setSpeed(90);motor4.setSpeed(90);car_back();Serial.println("langsam vor");break;
    case 31 ... 45:       car_back();Serial.println("Vorwaerts");break;
    default:              car_back();Serial.println("default");break;
  } 
}
void drive (){
number=random(1,2);
if (number==1) {
  car_left();
}
if (number==2) {
  car_right();
}
else {//do nothing
}
}
void car_back() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}
void car_front() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);

}
void car_left() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(FORWARD);
  motor4.run(FORWARD);

}
void car_right() {
  motor3.run(RELEASE);
  motor4.run(RELEASE);
  motor1.run(FORWARD);
  motor2.run(FORWARD);

}
void car_Stop() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);

}

Mit dem HC-SR funktioniert soweit alles. Nun möchte ich, wie man vielleicht im Bereich

void switchdrive(){
 distance=0;
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(4);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  distance = round(duration * .0343) / 2;
  Serial.print("Distance: ");
  Serial.println(distance);
  delay(100); 
  switch (distance){
    case 1 ... 15:        car_front();Serial.println("zurueck");delay(1500);drive();Serial.println(number);break;
    case 16 ... 30:       motor1.setSpeed(90);motor2.setSpeed(90);motor3.setSpeed(90);motor4.setSpeed(90);car_back();Serial.println("langsam vor");break;
    case 31 ... 45:       car_back();Serial.println("Vorwaerts");break;
    default:              car_back();Serial.println("default");break;
  } 
}
void drive (){
number=random(1,2);
if (number==1) {
  car_left();
}
if (number==2) {
  car_right();
}

sehen kann, den arduino willkürlich zwischen links und rechts abbiegen entscheiden lassen. Eigentlich ganz simpel, aber er gibt IMMER 1 aus, also links abbiegen. Das macht er dann auch.

Wie du z.B. hier nachlesen kannst, ist der obere Wert exklusiv, also nicht inbegriffen.

random(1,3) ergibt also „zufällige“ Werte von 1 bis 2.

geht einfacher so:

number=random(1,2);
if (number==1) {
  car_left();
} else {
  car_right();
}

Die obere Grenze bei random gehört nicht zum Umfang.
Also:

number = random(1,3);

Gruß Tommy

if ( random(2) ) car_left(); else car_right();

Sowohl random(max) als auch random(min, max) verwenden intern eine Division, bzw. Modulo.

Und sind damit unnötig teuer/aufwändig.

// if (random() % 1)  car_left(); else car_right(); // falsch
if (random() & 1)  car_left(); else car_right(); // so war es beabsichtigt

Gut, macht in diesem Fall nichts aus, weil der Compiler es zu optimieren weiß.
Aber dennoch sollte man eigentlich immer die einfachere Variante wählen.

Edit:
Die Zeile ist falsch, siehe #8
Korrigiert.

Mit Modulo 1 kommt meiner nur in den else zweig.

Mit Modulo 2 klappt es bei mir auf einem Uno:

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

void loop() {
   if (random() % 2)  Serial.println("ja"); else Serial.println("nein");
   delay(1000);
}

Aua!

Habe mich vertippt!

if (random() & 1)  car_left(); else car_right();

Natürlich meinte ich das binäre AND und nicht Modulo.

Auch ich kann mich irren!
Ungerne, aber passiert!

Danke für die Kontrolle.
Und ein großes "Verzeihung bitte" an alle.