Рандомные числа в двух потоках - 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 Что не верно. Не знаю как подробней объяснить, надеюсь описал понятно.
Листинг программы
  1. namespace ConsoleApplication3
  2. {
  3. class MyThread
  4. {
  5. public int kom1 = 10;
  6. public Thread thrd;
  7. public MyThread(string name)
  8. {
  9. thrd = new Thread(new ThreadStart(this.run));
  10. thrd.Name = name; //Устанавливаем имя потока
  11. thrd.Start(); //Запускаем поток на выполнение
  12. }
  13. //Входная точка потока (метод run)
  14. void run()
  15. {
  16. Console.WriteLine(thrd.Name + ". Количество участников " + kom1);
  17. do
  18. {
  19. lock (this) //По идее, код заключённый в lock, должен поочерёдно выполняться сначала 1 потоком, потом 2 потоком. Но видимо, я не совсем правильно понимаю работу этого оператора
  20. {
  21. Random rand = new Random();
  22. int r = rand.Next(1, 10);
  23. int r2 = rand.Next(1, 10);
  24. Thread.Sleep(1000);
  25. Console.WriteLine("В команду " + thrd.Name + " прибыло " + r + ", убыло " + r2 + ", в команде осталось " + (kom1 + r - r2));
  26. kom1 += r;
  27. kom1 -= r2;
  28. }
  29. Thread.Sleep(100);
  30. }
  31. while (kom1 > 0);
  32. }
  33. }
  34. class MoreThread
  35. {
  36. public static void Main()
  37. {
  38. Console.WriteLine("Игра началась");
  39. //Создаем два потока
  40. MyThread mt1 = new MyThread("Команда №1");
  41. MyThread mt2 = new MyThread("Команда №2");
  42. do
  43. {
  44. Thread.Sleep(100);
  45. }
  46. while ((mt1.kom1 > 0 && mt2.kom1 > 0));
  47. mt1.thrd.Abort();
  48. mt2.thrd.Abort();
  49. Console.WriteLine("Игра завершена");
  50. Console.ReadKey();
  51. }
  52. }
  53. }

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

textual
Листинг программы
  1. namespace ConsoleApplication3
  2. {
  3.     class MyThread
  4.     {
  5.         public int kom1 = 10;
  6.         public Thread thrd;
  7.         static Random rand = new Random();
  8.  
  9.         public MyThread(string name)
  10.         {
  11.             thrd = new Thread(new ThreadStart(this.run));
  12.             thrd.Name = name; //Устанавливаем имя потока
  13.             thrd.Start(); //Запускаем поток на выполнение
  14.         }
  15.         //Входная точка потока (метод run)
  16.         void run()
  17.         {
  18.  
  19.             Console.WriteLine(thrd.Name + ". Количество участников " + kom1);
  20.             do
  21.             {
  22.  
  23.                 lock (this) //По идее, код заключённый в lock, должен поочерёдно выполняться сначала 1 потоком, потом 2 потоком. Но видимо, я не совсем правильно понимаю работу этого оператора
  24.                 {
  25.                     //Random rand = new Random();
  26.                     int r = rand.Next(1, 10);
  27.                     int r2 = rand.Next(1, 10);
  28.                     Thread.Sleep(1000);
  29.                     Console.WriteLine("В команду " + thrd.Name + " прибыло " + r + ", убыло " + r2 + ", в команде осталось " + (kom1 + r - r2));
  30.                     kom1 += r;
  31.                     kom1 -= r2;
  32.                 }
  33.                 Thread.Sleep(100);
  34.                
  35.             }
  36.             while (kom1 > 0);
  37.         }
  38.     }
  39.     class MoreThread
  40.     {
  41.         public static void Main()
  42.         {
  43.             Console.WriteLine("Игра началась");
  44.             //Создаем два потока
  45.             MyThread mt1 = new MyThread("Команда №1");
  46.             MyThread mt2 = new MyThread("Команда №2");
  47.             do
  48.             {
  49.                 Thread.Sleep(100);
  50.             }
  51.             while ((mt1.kom1 > 0 && mt2.kom1 > 0));
  52.             mt1.thrd.Abort();
  53.             mt2.thrd.Abort();
  54.             Console.WriteLine("Игра завершена");
  55.             Console.ReadKey();
  56.         }
  57.     }
  58. }

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


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

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

13   голосов , оценка 3.846 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы