Проблема со случайным целым числом в C-робототехнике

#random

#Случайный

Вопрос:

Итак, в принципе, я пытаюсь заставить своего робота двигаться вперед, пока он не обнаружит стену, затем повернуть вспять, а затем повернуть в случайном направлении. Проблема в том, что он поворачивает только направо. Если кто-нибудь сможет помочь в этом, я буду ОЧЕНЬ признателен, потому что я потратил на это около двух дней, и даже мой учитель не может понять, что с этим не так. Это больше похоже на робототехнику, а не просто на код, но вы, вероятно, можете просто игнорировать жаргон двигателя/сервопривода. Спасибо!

 #include lt;PRIZM.hgt; // include PRIZM library #include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;time.hgt; #define RAND_MAX 1 PRIZM prizm; // instantiate a PRIZM object “prizm” so we can use its functions   void setup() {    prizm.PrizmBegin(); //initialize PRIZM  prizm.setServoSpeed(1,50);  prizm.setMotorInvert(1,1); // invert the direction of DC Motor 1  // to harmonize the direction of  // opposite facing drive motors }   void loop() {  int x;  x = 1;  int r;  while((prizm.readSonicSensorCM(3) gt; 50)amp;amp;(x == 1))  {  prizm.setMotorPowers(40,40); // if distance greater than 25cm, do this  prizm.setServoPosition(1,146.75);  prizm.setServoPosition(2,55.5);  r = rand();    }  if((prizm.readSonicSensorCM(3) lt;= 50)||(x == 0))  {  x--;  prizm.setServoPosition(1, 54.5);  prizm.setServoPosition(2,145.25);  prizm.setMotorPowers(0,0);  delay(250);  prizm.setMotorPowers(-30,-30);   delay(750);  prizm.setMotorPowers(0,0);  delay(300);  if (r == 0) {  prizm.setMotorPowers(-50,50);  delay(1100);  }  else {  prizm.setMotorPowers(50,-50);  delay(1100);  }  prizm.setMotorPowers(0,0);  delay(200);  x  ;  }  }   

Комментарии:

1. Любопытно, при чем тут комментарий // if distance greater than 25cm, do this ? prizm.readSonicSensorCM(3) gt; 50 Это 50 то же самое, что 25 см ?

2. Я изменю его сейчас, но я использовал часть шаблона с комментариями, так что эта часть не точна

Ответ №1:

Обратите внимание, что ваше переопределение RAND_MAX не влияет на вывод rand() функции. Это не параметр для функции, а константа, указывающая вам, каково максимальное значение выходных данных.

Лучший способ получить 50% вероятности в вашем if (r == 0) случае-это перейти на одну сторону , если r она четная, на другую, если она нечетная:

 if ((r % 2) == 0) {  prizm.setMotorPowers(-50,50);  delay(1100);  }  else {  prizm.setMotorPowers(50,-50);  delay(1100);  }  

Комментарии:

1. Я понимаю, что вы имели в виду, и мне не пришло в голову использовать модуляцию. Спасибо