Рандомные числа в двух потоках - 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();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д