2014-08-30 102 views
0

im在c#中的骰子模拟器中面临一个问题。函数RandomGenerator生成一对骰子,直到这两个骰子的总和等于参数中的给定数字(从2到12)。骰子对的滚动次数。问题是,当我输入一个偶数时,它正确地返回count.But当我输入一个奇数时,它什么都不做,甚至没有给出错误,短划线闪烁,闪烁。代码如下。任何人都可以帮助我?骰子模拟器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

你错过了一个for循环或什么?我甚至没有看到使用变量n – 2014-08-30 09:41:04

+2

您是否尝试**调试**代码? – Carsten 2014-08-30 09:44:03

+0

也请添加缺少的*循环*并删除第二个RNG - 只需要一个 – Carsten 2014-08-30 09:45:33

回答

6

的问题是,你正在使用两个Random实例。默认为they're initialized with Environment.TickCount seed,其精度约为15毫秒。这意味着它几乎可以确保您的Random类实例获得完全相同的种子,因此每次调用Next时都会生成相同的值。两个相同数字的总和总是偶数。

一个合适的解决方案是使用骰子的单个实例Random

从我
+0

我明白你的解决方案,我的程序运行良好,但你可以启发我关于“种子”,它是什么意思? – 2014-08-30 10:16:53

+0

[Wikipedia](https://en.wikipedia.org/wiki/Random_seed)可以让你开始。您可以在我链接的源文件中看到它在.NET中的实际工作方式。 – 2014-08-30 10:20:27

0

难道你错过了一段时间或for循环?

我想你应该有类似下面的代码在你的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

您应该添加为什么选择只使用一个“随机”对象而不是OP中的两个。 – 2014-08-30 09:51:04

+0

你是对的@BartvanNierop,我忘记了。但维克多的解释是绝对正确的:) – LuisF 2014-08-30 09:58:40

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之间。这是为了避免在条件sum != n永远不会实现时陷入do-while循环。