Как измерить количество совпадений 0 и 1

#c# #boolean #logic #console-application

#c# #логическое #Логические #консольное приложение

Вопрос:

Вот код, который выводит 1 или 0 в зависимости от равенства двух массивов

 static void Main(string[] args)
        {

            while (true)
            {
                Console.WriteLine(Here());  
            }
  

Вот где происходит волшебство.

 static int Here()
        {
            Random rnd = new Random();
            PlayerInput();
            int[] intarray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            string[] sarray = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };


                int i = rnd.Next(10); // creates a number between 1 and 10
                int x = rnd.Next(10);
                string iarray = intarray[x].ToString();
                if (iarray == sarray[i])
                {
                    return 1;
                }
                else
                {
                    return 0;
                }



        }
  

он выводит 0, когда два массива не равны, и 1 наоборот. теперь я хочу подсчитать, сколько раз он выводит 0 и 1.

Вопросы:

  1. Как я мог это сделать?

  2. Должен ли я передавать выходные данные в массив для упрощения манипулирования?

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

1. Когда вы разорвете свой цикл while?

2. вы знакомы с выражениями lamda ..? вы можете сделать это легко, используя следующее .GroupBy, .Where, and .Select Я могу опубликовать пример с использованием не дубликатов и дубликатов в списке<T>, если вам нужно посмотреть рабочий пример для перехода

3. Как предполагается завершить ваш while цикл? Никогда не используйте while(true) , если вы действительно не знаете, что делаете. Это будет повторяться бесконечно.

4. Кроме того, почему вы конвертируете оба ints в Strings , чтобы сравнить их? Просто сравните их как int значения

Ответ №1:

Если я не неправильно понимаю ваш вопрос, похоже, что у вас могло бы быть просто две встречные переменные:

 static void Main(string[] args)
{
    int totalOnes = 0;
    int totalZeroes = 0;

    while (true) // need to replace this with something that will actually exit!!
    {
        int ret = Here();
        if (ret == 1) totalOnes  ; else totalZeroes  ;
        Console.WriteLine(ret);  
    }

    Console.WriteLine("Total Ones: {0} Total Zeroes: {1}", totalOnes, totalZeroes);
}
  

РЕДАКТИРОВАТЬ: Спасибо L J за указание на то, что ваш while цикл никогда не завершится, поскольку у вас есть while (true) . Вам нужно решить эту проблему.

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

1. О, ты был первым.. хорошо. Но имейте в виду, что здесь if (ret == 1) totalOnes ; else totalZeroes ; totalZeroes не обнуляет счетчик, это счетчик «не один», потому что здесь в будущем может вернуться 2 или 10.

2. Может ли это быть, хотя? Как он дал, возвраты могут быть только 0 или 1

3. @tym32167 — Я согласен с Хэнком. В вопросе четко указано, что он возвращает ноль или единицу. Ваш метод необычен; я бы просто использовал switch , если бы хотел учесть другие возможные случаи.

4. @rory.ap ofcource оба кода будут работать, и я не хочу сказать, что ваш код плохой, просто, исходя из опыта, требования часто меняются, и имена переменных должны соответствовать значениям переменных. В вашем случае totalZeroes означает, сколько раз результат не равен 1, и я просто хотел это заметить.

5. Просто ввод: элемент управления никак не выйдет из while цикла

Ответ №2:

вот так

 static void Main(string[] args)
{
    var zeroCount = 0;
    var oneCount = 0;
    while (true)
    {
        var result = Here();
        if (result == 1) oneCount  ;
        if (result == 0) zeroCount  ;
        Console.WriteLine($"Actual result {result}, zero count {zeroCount}, One count {oneCount}");     
    }
}
  

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

1. @Tinwor результатом int Here() может быть что угодно, потому что он возвращает int . Думайте об этой функции как о черном ящике.

2. @tym32167 Технически, OP мог отредактировать свой Here() метод, чтобы возвращать любой int , да. Но нас попросили дать ответ для его текущего кода, а не о возможности того, каким его код может быть в будущем. Here() действительно возвращает int , но возврат является конечным выбором ints в его текущем состоянии. Если OP никогда не нуждается в том, чтобы этот метод возвращал что-либо, кроме 0 или 1, тогда зачем учитывать что-либо еще?

3. Я не хочу говорить, что этот код идеален, я просто упоминаю, что имена переменных должны соответствовать значениям переменных. В моем случае zeroCount означает, сколько результатов было нулевым. В случае ответа от rory.ap это означает, насколько результат не равен 1

4. Это было бы правильно, если бы вы взяли инструкцию if и рассмотрели ее саму по себе, без учета других факторов. Но, учитывая текущий Here() метод, его totalZeros действительно означает, сколько результатов было 0 . Это ситуационно правильно, но универсально расплывчато. Я понимаю вашу точку зрения, но вы должны учитывать ситуацию с переменными при формировании мнения о неоднозначности имен переменных.

5. о, неважно, просто игнорируй меня, нужно меньше работать и больше отдыхать … 🙂

Ответ №3:

 static int Here()
        {

            Random rnd = new Random();
            PlayerInput();
            int[] intarray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            string[] sarray = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };

                **var Count1 = 0;
                var Count0 = 0;**
                int i = rnd.Next(10); // creates a number between 1 and 10
                int x = rnd.Next(10);
                string iarray = intarray[x].ToString();
                if (iarray == sarray[i])
                {
                    **Count1  ;**
                    return 1;
                }
                else
                {
                    **Count0  ;**
                    return 0;
                }



        }
  

Count0 будет содержать количество раз, когда было выведено 0.

Счетчик 1 будет содержать количество раз, когда был выведен 1.

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

1. Count1 и Count0 в настоящее время являются недоступными переменными за пределами Here() , поскольку метод является закрытым.