2016-01-29 3 views
2

Мой лектор попросил нас написать цикл, чтобы попросить пользователя угадать случайное число в 1-100. Когда я тестировал программу, я нашел самый быстрый способ получить правильный номер, всегда угадывая среднее число. Затем мне сказали, что этот способ называется алгоритмом бинарного поиска. Поэтому я подумываю написать другую программу, чтобы компьютер мог угадать случайное число, используя двоичный поиск. Ну, моя программа получит правильный номер, но есть ошибка, которая действительно беспокоит меня, что количество угадываний 1 больше. Может ли кто-нибудь дать мне подсказку?Двоичный поиск номера догадок

class Program 
{ 
    static void Main(string[] args) 
    { 
     int start = 0; 
     int end = 100; 
     Random myRandom = new Random(); 
     int computer = myRandom.Next(start, end); 
     int count = 1; 
     int guess; 
     guess = (end - start)/2 + start; 
     Console.WriteLine("Computer number: {0}, your guess is: {1}", computer, guess); 
     Console.WriteLine("Count {0}", count); 
     while (guess != computer) 
     { 
      guess = (end - start)/2 + start; 
      if (guess > computer) 
      { 
       end = guess; 
       Console.WriteLine("Your guess is too high, next guess: {0}", guess); 
      } 
      else 
      { 
       start = guess; 
       Console.WriteLine("Your guess is too low, guess again: {0}", guess); 
      } 
      count = count + 1; 
      Console.WriteLine("Count {0}", count); 
     } 
     Console.WriteLine("You got it. The number is {0}. It took you {1} guesses.", computer, count); 
     Console.ReadKey(); 
    } 
} 

Это результат, количество должно быть 7 не 8

номер компьютера: 77, ваше предположение: 50
Count 1
Ваше предположение слишком мало, думаю, еще раз: 50
Count 2
Ваше предположение слишком мало, думаю, еще раз: 75
граф 3
Ваше предположение слишком высока, рядом догадка: 87
граф 4
Ваше предположение слишком высока, следующий предположение: 81
графа 5
Ваше предположение слишком высока, следующий предположение: 78
графа 6
Ваше предположение является слишком низким, догадаться снова: 76
Count 7
Ваша догадка слишком низкая, еще раз догадайтесь: 77
Количество 8
У вас есть это. Число 77. У вас было 8 догадок.

+0

Я только что понял, что я должен угадать число внутри «если» и «еще» не снаружи, поэтому проблема решена. Спасибо вам, ребята. – Nelson

+0

Это не проблема. См. Мой ответ, вы угадываете тот же номер дважды, чтобы начать. –

ответ

2

объявляя

int count = 0; 

вместо

int count = 1; 

должны решить эту проблему.

РЕДАКТИРОВАТЬ:

да, вы правы. Если переместить часть кода и удаление некоторого это будет как этот

 static void Main(string[] args) 
     { 
      int start = 0; 
      int end = 100; 
      Random myRandom = new Random(); 
      int computer = myRandom.Next(start, end); 
      int count = 0; 
      int guess; 

      while (true) 
      { 
       guess = (end - start)/2 + start; 
       count = count + 1; 
       Console.WriteLine("Count {0}", count); 
       if (guess > computer) 
       { 
        end = guess; 
        Console.WriteLine("Your guess is too high, next guess: {0}", guess); 
       } 
       else if (guess < computer) 
       { 
        start = guess; 
        Console.WriteLine("Your guess is too low, guess again: {0}", guess); 
       } 
       else 
       { 
        break; 
       } 
      } 
      Console.WriteLine("You got it. The number is {0}. It took you {1} guesses.", computer, count); 
      Console.ReadKey(); 
     } 

вам не придется писать код дважды так (как было до времени и в то время)

+0

Нет, это не будет ... не близко. Прочтите программу. – Hogan

+0

Нет, если вы догадались в первый раз (_computer = 50_), тогда вы получите сообщение: «У вас ушло 0 догадок» – romanoza

+0

ах теперь вы добавили оператор if – Hogan

-2

count должно быть 0 для начала - не 1.

+0

Очень плохо ... прочитайте логику программы. – Hogan

-1

Добавить в проверке перед выводом и приращение:

while (guess != computer) 
{ 
    guess = (end - start)/2 + start; 
    if (guess != computer) 
    { 
     if (guess > computer) 
     { 
      end = guess; 
      Console.WriteLine("Your guess is too high, next guess: {0}", guess); 
     } 
     else 
     { 
      start = guess; 
      Console.WriteLine("Your guess is too low, guess again: {0}", guess); 
     } 
     count = count + 1; 
     Console.WriteLine("Count {0}", count); 
    } 
} 
+0

Это просто говорит «если он входит в цикл, вычтите 1». На самом деле это не решение, так как это полоса. –

+0

@KyleW Я понятия не имею, что вы имеете в виду. Я добавил инструкцию if к его исходному коду, чтобы заставить его работать правильно – Hogan

+0

Я говорю, что вы исправили эту проблему, рассматривая симптом, а не причину. –

0

Вы пишете следующий дубликат LOC вне время цикла:

guess = (end - start)/2 + start; 
Console.WriteLine("Computer number: {0}, your guess is: {1}", computer, guess); 
Console.WriteLine("Count {0}", count); 

while(guess != computer) 

Вот решение:

  1. Вы должны инициализировать свое предположение до значения, которое не падает между 0 и 100 i.e, guess = 999, чтобы он попал в цикл.

  2. Вы должны удалить повторяющиеся строки кода над временем.

  3. Инициализация count до 0.

Вот код для справки:

int start = 0; 
    int end = 100; 
    Random myRandom = new Random(); 
    int computer = myRandom.Next(start, end); 
    int count = 0; 
    int guess = 999; 

    while (guess != computer) 
    { 
     guess = (end - start)/2 + start; 
     if (guess > computer) 
     { 
      end = guess; 
      Console.WriteLine("Your guess is too high, next guess: {0}", guess); 
     } 
     else 
     { 
      start = guess; 
      Console.WriteLine("Your guess is too low, guess again: {0}", guess); 
     } 

     count = count + 1; 
     Console.WriteLine("Count {0}", count); 

    } 
    Console.WriteLine("You got it. The number is {0}. It took you {1} guesses.", computer, count); 
    Console.ReadKey(); 

Plus дублирования кода не является хорошей практикой кодирования.

Надеюсь, это поможет.

0

Я думаю, что do здесь более точен, чем while. Моя версия вашей программы:

int start = 0; 
int end = 100; 
Random myRandom = new Random(); 
int computer = myRandom.Next(start, end); 
int count = 0; 
int guess; 
Console.WriteLine("Computer number: {0}", computer); 
do { 
    count++; 
    Console.WriteLine("Count {0}", count); 
    guess = (end - start)/2 + start; 
    if (guess > computer) { 
     end = guess; 
     Console.WriteLine("Your guess is too high, your guess: {0}", guess); 
    } 
    else if (guess < computer) { 
     start = guess; 
     Console.WriteLine("Your guess is too low, your again: {0}", guess); 
    } 
} 
while (guess != computer); 

Console.WriteLine("You got it. The number is {0}. It took you {1} guesses.", computer, count); 
Console.ReadKey(); 

А выход-то вроде этого:

output

+0

вы также добавили другое заявление if ... do vs, хотя оно мало связано с этим. (каламбур) – Hogan

+0

@Hogan Эта строка: 'guess = (end-start)/2 + start;' и this 'Console.WriteLine (« Count {0} », count);' произошло дважды. В этом контексте утверждение «делать» лучше, чем «пока». – romanoza

0

Проблема заключается в том, что после первого предположения (вне цикла) вы не обновляя start или end , так что он снова догадывается о том же.

+0

Да, та же догадка сделана снова, но есть еще одна проблема - счет еще 1, его нужно изменить на 0, чтобы показать правильное значение. – frostedcoder

+0

@frostedcoder Это зависит от того, как вы его исправите. Если вы исправите это, обновив начало или конец после первоначальной догадки, то нет, счет должен быть равен 1. –

+0

Я согласен, что это зависит от того, как вы его исправите, но я не совсем уверен, что вы подразумеваете под обновлением начала и конца после первоначального предположения. Можете ли вы предоставить образец кода? Благодарю. – frostedcoder

Смежные вопросы