2014-08-30 2 views
0

im сталкивается с проблемой в симуляторе с кубиками в C#. Функция RandomGenerator генерирует пару кубиков, пока сумма этих двух не станет равным заданному числу (от 2 до 12) в параметре. количество раз, когда пара костей прокатывается. Проблема заключается в том, что когда я ввожу четное число, он правильно возвращает счет. Но когда я вхожу в нечетное число, он ничего не делает, даже не дает ошибку, тире продолжает мигать и мигает. Код приведен ниже. Может кто-нибудь мне помочь?Dice Simulator int C#

using System.Threading.Tasks; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 


     static int RandomGenerator(int n)          
     { 

      Random rand1 = new Random();            
      Random rand2 = new Random();            

      int sum = rand1.Next(1,7) + rand2.Next(1,7);         
      int count = 1;                

      { 
       sum = rand1.Next(1,7) + rand2.Next(1,7);         
       count++; 
      } 

      return count; 

     } 


     static void Main(string[] args) 
     { 
      Console.WriteLine("Hello! this program a pair of dice until total on dice is equal to your given number.\n\n"); 

      Console.WriteLine("Enter the number :"); 
      int num = int.Parse(Console.ReadLine()); 

      int rolls = RandomGenerator(num); 
      Console.WriteLine("The number of rolls are:" + rolls); 

     } 
    } 
} 
+0

Вам не хватает петли или что-то в этом роде? Я даже не вижу, что используется переменная n –

+2

Вы пробовали ** отлаживать ** свой код? – Carsten

+0

также добавляет отсутствующий * цикл * и удаляет второй RNG - вам нужен только один – Carsten

ответ

6

Проблема заключается в том, что вы используете два Random экземпляров. По умолчанию they're initialized with Environment.TickCount seed, который имеет точность около 15 миллисекунд. Это означает, что в значительной степени гарантировано, что ваши экземпляры класса Random получают одинаковое семя и, следовательно, генерируют одинаковые значения при каждом вызове Next. Сумма двух одинаковых чисел всегда четная.

Правильным решением было бы использовать один экземпляр Random для обоих кубиков.

+0

Я понял ваше решение, и моя программа работает нормально, но можете ли вы рассказать мне о «семени» и что это значит? –

+0

[Wikipedia] (https://en.wikipedia.org/wiki/Random_seed) может помочь вам начать работу. Вы можете увидеть, как это работает в .NET в исходном файле, который я связал. –

0

Вам не хватает или не нужно цитировать?

Я думаю, вы должны иметь что-то вроде ниже кода в методе RandomGenerator:

static int RandomGenerator(int n)          
    { 

     Random rand1 = new Random();            

     int sum = rand1.Next(1,7) + rand1.Next(1,7);         
     int count = 1;                

     //while the sum variable isn't equal to your provided number, roll the dices again 
     while(sum != n) 
     { 
      sum = rand1.Next(1,7) + rand1.Next(1,7);         
      count++; 
     } 

     return count; 

    } 
+0

. Вы должны добавить, почему вы решили использовать только один объект «Random» вместо двух в OP. –

+0

Ты прав @BartvanNierop, я забыл об этом. Но объяснение Виктора абсолютно правильно :) – LuisF

1

Предложенное решение от меня:

public static int RandomGenerator(int n) 
{ 
    Random random = new Random(); 
    int sum = 0; 
    int count = 0; 

    do 
    { 
     sum = random.Next(1, 7) + random.Next(1, 7); 
     count++; 
    } while (sum != n); 

    return count; 
} 

Виктор Ефимов прав насчет случайного экземпляра, и я столкнулся с аналогичной проблемой, как только с генератором случайных чисел для генерации цвета :)

Я также предлагаю вам выполнить проверка работоспособности на входе пользователя, чтобы убедиться, что введенные значения всегда находятся между 2 и 12. Это делается для того, чтобы избежать попадания в цикл do-while, когда условие sum != n никогда не сбудется.