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