Kennnkey Ответов: 2

Создайте функцию подбрасывания кубика


Цитата:
Напишите приложение, чтобы имитировать бросание трех кубиков 100 раз.
Подсчитайте частоты граней трех кубиков, которые
приходите с тем же номером. Выведите выходные данные на консоль.

1. Напишите псевдокод алгоритма
2. Используйте функцию или функции для имитации броска кубика
3. Используйте функцию для отображения выходных данных
4. Используйте соответствующие структуры управления разработать свой алгоритм


Что я уже пробовал:

class HeartRate
    {
        private string firstname;
        private string lastname;
        private int yearofbirth;
        private int currentyear;

       
        public string FirstName
        {
            get
            {
                return firstname;
            }

            set
            {
                firstname = value;
            }
        }

        public string LastName
        {
            get
            {
                return lastname;
            }

            set
            {
                lastname = value;
            }
        }

Sandeep Mewara

А ваша проблема в чем? Где ты застрял?

Richard MacCutchan

Пожалуйста, не меняйте свой вопрос, когда люди предоставляют предложения и решения, так как они не будут соответствовать новому вопросу.

2 Ответов

Рейтинг:
4

CPallini

Ваш код может работать, с некоторыми изменениями. Однако, используя немного больше мощности структуры данных массива, его можно сделать более компактным:

class Program
{
    public static int [] die_toss(int iterations)
    {
        const int MAX = 6;
        const int DICE = 3;
        Random r = new Random();
        int []die = new int [DICE];
        int [] occurrence = new int[MAX];

        for (int n = 0; n < iterations; ++n)
        {
            for (int d = 0; d < DICE; ++d)
                die[d] = r.Next(0,MAX);

            if ( die[0] == die[1] && die[0] == die[2])
                    ++occurrence[die[0]];
        }
        return occurrence;
    }
    public static void display(int [] occurrences)
    {
        Console.WriteLine("Face |3x Frequency");
        Console.WriteLine(".....|............");
        for (int n = 0; n < occurrences.Length; ++n)
            Console.WriteLine(string.Format("  {0}  | {1}", (n+1), occurrences[n]));
    }

    static void Main(string[] args)
    {
        int iterations = 100;
        int [] occurrences = die_toss(iterations);
        display(occurrences);
    }
}




[обновление]
"Фиксированный" код операции, как и было запрошено.
class Program
 {
     public static int[] DieToss()
     {
         Random r = new Random(); // create object of Random class

         int die1, die2, die3;

        int[] intAnswer = new int[6];

         for (int i = 0; i < 1000000; i++)    // toss 100 time
         {

             die1 = r.Next(1, 7);          // generate random number betwween 1 and 6
             die2 = r.Next(1, 7);
             die3 = r.Next(1, 7);


             if (die1 == 1 && die1 == die2 && die1 == die3)
             {
             		++intAnswer[0];                      // An if condition that state if a die appears with the face = 1 and
                                              // same face appears on the other two dice at same time
                                              // then calculate the number of times the face 1 came out on all 3 die after 100 rolls

             }

             else if (die1 == 2 && die1 == die2 && die1 == die3)
             {
                 ++intAnswer[1];                                           // if three dice has same face then increase count

             }

             else if (die1 == 3 && die1 == die2 && die1 == die3)
             {
                 ++intAnswer[2];;                                           // if three dice has same face then increase count

             }

             else if (die1 == 4 && die1 == die2 && die1 == die3)
             {
                 ++intAnswer[3];;                                           // if three dice has same face then increase count

             }

             else if (die1 == 5 && die1 == die2 && die1 == die3)
             {
                 ++intAnswer[4];;                                           // if three dice has same face then increase count

             }

             else if (die1 == 6 && die1 == die2 && die1 == die3)
             {
                 ++intAnswer[5];;                                           // if three dice has same face then increase count

             }


         }
         return intAnswer;

     }

     public static void Display(int [] intAnswer)
     {
         Console.WriteLine("Face |3x Frequency");
         Console.WriteLine(".....|............");
         Console.WriteLine("  1  | " + intAnswer[0]);
         Console.WriteLine("  2  | " + intAnswer[1]);
         Console.WriteLine("  3  | " + intAnswer[2]);
         Console.WriteLine("  4  | " + intAnswer[3]);
         Console.WriteLine("  5  | " + intAnswer[4]);
         Console.WriteLine("  6  | " + intAnswer[5]);

         //return 0;

     }

     static void Main(string[] args)
     {
         int count;

         
         int [] intAnswer = DieToss();         // call dieToss method
         Display(intAnswer);         // call display method
     }


 }

[/обновление]


George Swan

Ваш ответ превосходен. Будет ли код более надежным, если симулятор генерирует значения от 1 до 6, а не от 0 до 5?

CPallini

С чего бы это?
Кстати, спасибо.

PIEBALDconsult

Если вы играете в Cosmic Wimpout, то вы знаете, что шесть граней куба-это 10, планеты, треугольники, молнии, 5 и звезды. :Д

George Swan

Потому что, если вы используете его для имитации одного броска кости, вам нужно помнить, чтобы исправить результат, добавив к нему 1. В качестве проверки точности, вероятность совпадения лица с 3 кубиками равна 6/(6*6*6)= 2.8%. На мой взгляд,размер выборки в этом вопросе слишком мал, чтобы это проверить.

CPallini

Добавление одного из них, на мой взгляд, не имеет большого значения (и позволяет непосредственно индексировать массив вхождений).
Да, образец определенно слишком мал. Один миллион итераций, делает соответствие со статистикой лучше.

BillWoodruff

Проголосовали: 3 Если вы перепишете код операции, поможет ли это им учиться ? или это учит их, что есть другие люди, которые сделают за них их работу ?

CPallini

Если вы перепишете код операции, поможет ли это им учиться ?
Да, по-моему.

Dave Kreskowiak

Нет, это не так. Выполнение чьей-то домашней работы для них на самом деле не помогает им. Вы забрали самую важную часть задания. Думая о проблеме и ломая ее. Оперативники получили рабочий код, но они понятия не имеют, как вы туда попали.

Цитирую:
"Пожалуйста, объясните мне, где я ошибаюсь в своем коде, и как я могу исправить его, чтобы он работал, если я буду использовать и следовать своему собственному коду."

Kennnkey

Большое вам спасибо @CPallini ответ исправит мою проблему, я действительно ценю эту работу.

Kennnkey

Пожалуйста , объясните мне, где я ошибаюсь в своем коде, и как я могу исправить его, чтобы он работал, если я буду использовать и следовать своему собственному коду. Спасибо

CPallini

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

Kennnkey

Отлично, теперь я увидел проблему в своей работе, спасибо Вам большое, сэр, за помощь и объяснение, я действительно ценю вашу помощь.

CPallini

Добро пожаловать.

Рейтинг:
19

OriginalGriff

Начните с тщательного чтения инструкций и написания метода, имитирующего прокатку штампа:

private static Random rand = new Random();
private static int RollDie()
   {
   return rand.Next(6) + 1;
   }

А потом проверить его:
for (int i = 0; i < 10; i++)
    {
    Console.WriteLine(RollDie());
    }
Убедитесь, что вывод выглядит довольно случайным:
1
3
4
5
6
5
4
1
2
1

Это важно, потому что если вы посмотрите внимательно, то заметите важное различие между вашим кодом и моим: я создаю статический случайный экземпляр уровня класса и повторно использую его, когда мне нужно случайное число, в то время как вы создаете его, когда хотите, внутри метода и отбрасываете в конце.

Random number sequences are initialised to a "different starting point" each time you create them - and this is normally the system clock for the computer they are running on. If you create two instance too close together, the clock time hasn't changed at all (just like the time in a boring lesson never changes between two looks at the clock) so the random sequence is started from the same point each time. If your computer is powerful enough - and it almost certainly is - then call a method with creates a Random instance and gets a single value from it 100 times in a small loop and it will generate 100 identical values! Move the instance into the method, and try again, and I get identical values very time:
3
3
3
3
3
3
3
3
3
3

Мой код создает экземпляр один раз и использует его повторно, поэтому он всегда получает случайные значения - у них могут быть некоторые дубликаты, но такова природа случайных чисел, они делают это так же, как вы можете бросить реальный кубик три раза и получить шесть каждый раз - иногда! :смеяться:

Поэтому делайте небольшие шаги и проверяйте их на ходу: убедитесь, что он делает именно то, что вы ожидаете, прежде чем переходить к следующему биту.
Теперь у вас есть работающий метатель штампов, вы можете начать со следующего бита: прокатка трех штампов, вызывая метод три раза и проверяя, что вы получаете в результате.

Это может помочь: Как написать код для решения проблемы, руководство для начинающих[^]


BillWoodruff

+5 хорошо видеть еще один пример вашего дара для обучения навыкам, необходимым ОП для решения проблемы, а не для написания кода для ОП !

OriginalGriff

Дайте человеку рыбу, и вы будете кормить его в течение дня.
Научите человека ловить рыбу, и вы не увидите этого мерзавца неделями! :Д

BillWoodruff

Моя версия такова: дайте человеку кошмар, и он может умереть от страха; научите человека кричать, и он сможет жить с ужасом, который он видит, глядя на него в зеркало.