Рандомные числа в двух потоках - 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();
}
}
}