2015-07-26 1 views
1

Я работаю над C# Lab в Head First C# book.A Day at the Races - Head first C#

Когда я нажимаю кнопку запуска - собаки должны бежать, пока один из них не достигнет конца. Каждая собака должна бежать со случайной скоростью, но все мои собаки работают с одинаковой скоростью; инициализации/

Собаки:

GreyhoundArray[0] = new Greyhound(){ 
      MyPictureBox = GreyhoundPictureBox1, 
      StartingPosition = GreyhoundPictureBox1.Left, 
      RacetrackLenght = TrackPictureBox.Width - GreyhoundPictureBox1.Width, 
      MyRandom = MyRandom     
     }; 
     GreyhoundArray[1] = new Greyhound(){ 
      MyPictureBox = GreyhoundPictureBox2, 
      StartingPosition = GreyhoundPictureBox2.Left, 
      RacetrackLenght = TrackPictureBox.Width - GreyhoundPictureBox2.Width, 
      MyRandom = MyRandom 
     }; 
     GreyhoundArray[2] = new Greyhound(){ 
      MyPictureBox = GreyhoundPictureBox3, 
      StartingPosition = GreyhoundPictureBox3.Left, 
      RacetrackLenght = TrackPictureBox.Width - GreyhoundPictureBox3.Width, 
      MyRandom = MyRandom 
     }; 
     GreyhoundArray[3] = new Greyhound(){ 
      MyPictureBox = GreyhoundPictureBox4, 
      StartingPosition = GreyhoundPictureBox4.Left, 
      RacetrackLenght = TrackPictureBox.Width - GreyhoundPictureBox4.Width, 
      MyRandom = MyRandom 
     }; 

Начало кода кнопки:

private void StartButton_Click(object sender, EventArgs e) 
    { 
     timer1.Enabled = true; 
    } 

Таймер код:

private void timer1_Tick(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 4; i++) 
     { 
      if (GreyhoundArray[i].Run()) 
       timer1.Enabled = true; 
      else 
       timer1.Enabled = false; 
     } 
    } 

метод Run:

public bool Run() 
    { 
     MyRandom = new Random(); 

     int distance = MyRandom.Next(1, 5); 
     MyPictureBox.Left += distance; 

     if(MyPictureBox.Left >= RacetrackLenght) 
      return false; 
     else 
      return true; 
    } 
+0

Хотя я согласен с основной причиной * проблемы, являющейся предлагаемым дубликатом, похоже, что уже существует достаточная поддержка для использования одного экземпляра здесь ... так что было бы полезно иметь отдельный ответ для этого, IMO , –

+0

@jon: Как обычно, я читал материал, который вы пишете (или публиковали), но я просто не понимаю: это просто еще один вопрос о том, почему мои Randoms не являются случайными вообще. – TaW

+0

@TaW: Не очевидно, потому что есть * попытка * использовать один и тот же «Случайный» каждый раз - видеть, как инициализируются массивы. Просто эта попытка сорвалась, создав новый экземпляр внутри 'Run'. –

ответ

3

Ваш метод Run создает новый экземпляр Random(). Я подозреваю, что вы не хотите этого делать. В конце концов, вы уже получили свойство MyRandom, которое вы заполняете при создании массива.

Просто достаньте линию:

MyRandom = new Random(); 

и посмотреть, что происходит.

Как бы то ни было, вы создаете новый экземпляр Random каждый раз, когда вызывается Run() ... каждый из которых будет высеваться из текущего времени. Это означает, что если вы назовете Run несколько раз подряд подряд (в любом случае), вы получите тот же самый distance, потому что семя будет таким же.

Без этого дополнительного создания вы будете использовать тот же экземпляр Random для всех борзых, что означает, что вы будете генерировать, вероятно, разные номера для каждого звонка до Next. Это нормально, если все в одном и том же потоке - см. my article on Random для получения подробных сведений о различных сложных аспектах случайности.

Ваш код уже пытается сделать правильную вещь, установив MyRandom свойство инициализации - это просто, что это то портит его, переписав это свойство в методе Run.

+0

Спасибо, отлично работает! :) – Ardoos

Смежные вопросы