Рандомные числа в двух потоках - C#

Узнай цену своей работы

Формулировка задачи:

Задание звучит так: Противостояние нескольких команд. Каждая команда увеличивается на случайное количество бойцов и убивает случайное количество бойцов участника. Борьба каждой команды реализуется в отдельном потоке. Пытаюсь сделать следующим способом. Проблема в том, что два потока используют одни и те же рандомные числа. На скрине хорошо это видно. В обоих командах одинаковое число игроков. В данном случае 10. Структура вывода должна быть следующей: В команду Команда №1 прибыло X, убыло Y, в команде осталось 10+X+Y В команду Команда №2 прибыло S, убыло F, в команде осталось 10+S+F Где X, Y, S, F - разные рандомные числа от 0 до 10. Они могут

иногда

повторяться, но не постоянно, как на скрине. И так далее. Число игроков в команде 1 в рассчитывается одном потоке, число игроков в команде 2 рассчитывается в другом потоке. Расчёт идёт пока в какой либо команде не останется игроков. В данном коде структура вывода следующая: В команду Команда №1 прибыло X, убыло Y, в команде осталось 10+X+Y В команду Команда №2 прибыло X, убыло Y, в команде осталось 10+X+Y Что не верно. Не знаю как подробней объяснить, надеюсь описал понятно.
namespace ConsoleApplication3
{
    class MyThread
    {
        public int kom1 = 10;
        public Thread thrd;
 
        public MyThread(string name)
        {
            thrd = new Thread(new ThreadStart(this.run));
            thrd.Name = name; //Устанавливаем имя потока
            thrd.Start(); //Запускаем поток на выполнение
        }
        //Входная точка потока (метод run)
        void run()
        {
 
            Console.WriteLine(thrd.Name + ". Количество участников " + kom1);
            do
            {
 
                lock (this) //По идее, код заключённый в lock, должен поочерёдно выполняться сначала 1 потоком, потом 2 потоком. Но видимо, я не совсем правильно понимаю работу этого оператора
                {
                    Random rand = new Random();
                    int r = rand.Next(1, 10);
                    int r2 = rand.Next(1, 10);
                    Thread.Sleep(1000);
                    Console.WriteLine("В команду " + thrd.Name + " прибыло " + r + ", убыло " + r2 + ", в команде осталось " + (kom1 + r - r2));
                    kom1 += r;
                    kom1 -= r2;
                }
                Thread.Sleep(100);
               
            }
            while (kom1 > 0);
        }
    }
    class MoreThread
    {
        public static void Main()
        {
            Console.WriteLine("Игра началась");
            //Создаем два потока
            MyThread mt1 = new MyThread("Команда №1");
            MyThread mt2 = new MyThread("Команда №2");
            do
            {
                Thread.Sleep(100);
            }
            while ((mt1.kom1 > 0 && mt2.kom1 > 0));
            mt1.thrd.Abort();
            mt2.thrd.Abort();
            Console.WriteLine("Игра завершена");
            Console.ReadKey();
        }
    }
}

Решение задачи: «Рандомные числа в двух потоках»

textual
Листинг программы
namespace ConsoleApplication3
{
    class MyThread
    {
        public int kom1 = 10;
        public Thread thrd;
        static Random rand = new Random();
 
        public MyThread(string name)
        {
            thrd = new Thread(new ThreadStart(this.run));
            thrd.Name = name; //Устанавливаем имя потока
            thrd.Start(); //Запускаем поток на выполнение
        }
        //Входная точка потока (метод run)
        void run()
        {
 
            Console.WriteLine(thrd.Name + ". Количество участников " + kom1);
            do
            {
 
                lock (this) //По идее, код заключённый в lock, должен поочерёдно выполняться сначала 1 потоком, потом 2 потоком. Но видимо, я не совсем правильно понимаю работу этого оператора
                {
                    //Random rand = new Random();
                    int r = rand.Next(1, 10);
                    int r2 = rand.Next(1, 10);
                    Thread.Sleep(1000);
                    Console.WriteLine("В команду " + thrd.Name + " прибыло " + r + ", убыло " + r2 + ", в команде осталось " + (kom1 + r - r2));
                    kom1 += r;
                    kom1 -= r2;
                }
                Thread.Sleep(100);
               
            }
            while (kom1 > 0);
        }
    }
    class MoreThread
    {
        public static void Main()
        {
            Console.WriteLine("Игра началась");
            //Создаем два потока
            MyThread mt1 = new MyThread("Команда №1");
            MyThread mt2 = new MyThread("Команда №2");
            do
            {
                Thread.Sleep(100);
            }
            while ((mt1.kom1 > 0 && mt2.kom1 > 0));
            mt1.thrd.Abort();
            mt2.thrd.Abort();
            Console.WriteLine("Игра завершена");
            Console.ReadKey();
        }
    }
}

ИИ поможет Вам:


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

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы