2009-12-02 2 views
3

Предположим, возможный исход штампа, брошенной одним из {1,2,3,4,5,6}C# Любая пара поколение

Когда две кости выбрасываются три раза, я хочу собирать случайные результаты из двух кубиков.

Моей реализация

var q = from threeTimes in new int[] { 1, 2, 3 } 
        let set1 = new Random().Next(1, 6) 
        let set2 = new Random().Next(1, 6) 
        select new { s1 = set1, s2 = set2 }; 

      foreach (var v in q) 
      { 
       Console.WriteLine("Die1 :{0} Die2 :{1}", v.s1, v.s2); 
      } 

Но большая часть времени я получаю то же значение для Die1 и Die2.

Я имею в виду

Die1: 5 Die2: 5 

Die1: 2 Die2: 2 

Die1: 2 Die2: 2 

Что коррекция мне нужно сделать, чтобы получить случайные пары?

+0

Особые: штампы или кости Плюрализм: кости – Vedran

+0

@Vedran - действительно. Ред. –

ответ

11

Это происходит потому, что вы создаете два Random объекты эффективно мгновенно. По умолчанию они засеяны с использованием значения времени, скорее всего, Environment.TickCount, хотя я не видел этого подтверждения.

Построив один Random, прежде чем ваш запрос будет решить эту проблему, как будет высева два объекта отдельно:

var rnd = new Random(); 
var q = from threeTimes in new int[] { 1, 2, 3 } 
     let set1 = rnd.Next(1, 6) 
     let set2 = rnd.Next(1, 6) 
     select new { s1 = set1, s2 = set2 }; 
3

Дайте вашему Случайному семя (его другому конструктору) и продолжайте использовать один и тот же экземпляр вместо того, чтобы вводить его каждый раз.

2

Создать один экземпляр Random(), а затем вызвать .next() на том, что:

Random random = new Random(); 
var q = from threeTimes in new int[] { 1, 2, 3 } 
        let set1 = random.Next(1, 6) 
        let set2 = random.Next(1, 6) 
        select new { s1 = set1, s2 = set2 }; 

      foreach (var v in q) 
      { 
       Console.WriteLine("Dice1 :{0} Dice2 :{1}", v.s1, v.s2); 
      } 
0

Что происходит в запуске random.Next(); Между?

Я думаю, что два вызова в одной и той же секунде будут получать одно и то же значение при использовании конструктора, тем самым вы его используете. Попробуйте создать экземпляр Random и используйте его вместо этого.

Random r = new Random(); let set1 = r.next (1,6); let set2 = r.next (1,6);

0

Bart de Smet имеет довольно тяжелую обязанность article на этом вы, возможно, захотите проверить.

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