我在c#中面对骰子模拟器中的一个问题。函数RandomGenerator生成一对骰子,直到这两个骰子的总和等于参数中的给定数字(从2到12)。计数变量保持次数这对骰子是滚动的。问题是当我输入偶数时它会正确返回计数。但是当我输入一个奇数时它什么也没做,甚至没有给出错误,短划线继续闪烁并闪烁。代码如下所示。任何人都可以帮助我吗?
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 :(得分:6)
问题在于您使用了两个Random
个实例。默认情况下为they're initialized with Environment.TickCount seed,其精度约为15毫秒。这意味着它几乎可以保证您的Random类实例获得相同的种子,因此在每次调用Next时都会生成相同的值。两个相同数字的总和始终是偶数。
一个合适的解决方案是为两个骰子使用Random
的单个实例。
答案 1 :(得分: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;
}
Victor Efimov对Random实例是正确的,我曾经使用随机生成器生成颜色时遇到类似问题:)
我还建议您对用户的输入进行健全性检查,以确保输入的值始终在2到12之间。这是为了避免在条件sum != n
永远不会出现时被捕获在do-while循环中真。
答案 2 :(得分:0)
Aren你错过了一段时间还是for-loop?
我认为你应该在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;
}