отладка — Начинающий Простая программа случайного блуждания со странной ошибкой setw

Мне было поручено создать очень простую программу случайного блуждания для класса C ++. Я написал это и был уверен, что все было правильно, но я получаю эту странную ошибку. От 0 до 10 шаги выстраиваются в линию, хотя координаты показывают, что они чередуются влево и вправо.

#include<iostream>
#include<iomanip>
#include<cmath>

using namespace std;
int main()
{
int steps,i,pos=10;
srand(13699);

cout << "Please enter the amount of steps to be taken: ";
cin >> steps;
cout << endl;
for (i=0;i<=steps;i++)
{
if (rand()%2)
pos+=1;
else
pos-=1;
cout << i << ": " << pos-10 << ": " << setw(pos) << "*" << endl;
}
} // main

Совершенно очевидно, что здесь есть какая-то закономерность, но я не могу понять, насколько я понимаю … Вот ссылка на скриншот с выводом, если это поможет. http://i.stack.imgur.com/USx4U.png Спасибо за любую помощь, которую вы можете оказать!

1

Решение

Ответ не в коде, а в вашей интерпретации результатов.

Если значение pos-10 меньше 0, то область, в которой вы печатаете это значение, длиннее (из-за знака минус), тогда ваш «ходок» смещается вправо на позицию в выводе.

Аналогичная причина, когда она идет от 9 до 10, это не правильно.

Подумайте о том, что означает, что двоеточия слева расположены не по прямой линии.

1

Другие решения

«Выстраивание» для i между 1 и 10 имеет смысл.

Возьмите первые две строки, например:

  • когда i == 1, у тебя есть pos == 10и * печатается через 10 пробелов после :,
  • когда i == 2, у тебя есть pos == 9и * печатается через 9 пробелов после :,

Но потому что вы печатаете 0 (один символ) в первой строке и -1 (два символа) во второй строке * в конечном итоге на том же месте в каждой строке.

Кстати, вы используете одно и то же значение (13699) для заполнения RNG при каждом запуске вашей программы.

Попробуйте использовать более «случайное» значение, например, основанное на времени:

srand((unsigned int)time(NULL));

Вам нужно будет #include <time.h> в вашем исходном файле.

0

По вопросам рекламы [email protected]