再次,我需要一些帮助,今天我做的是#homework,主要是创建一个方法,可以总结2个骰子卷的结果,到目前为止,这么好!,没有难的事情要做。 ..但是,当我运行我的代码时,一些非常奇怪的事情发生了,我会让我的代码和结果自己说话:
using System;
class Program
{
public static String GetTimestamp()
{
DateTime saveNow = DateTime.Now;
return saveNow.ToString("yyyyMMddHHmmssffff");
}
public static int ThrowDice()
{
int randVal1, randVal2;
string TS1, TS2;
Random rand = new Random();
randVal1 = rand.Next(1,6);
TS1 = GetTimestamp();
randVal2 = rand.Next(1,6);
TS2 = GetTimestamp();
Console.WriteLine("Dice 1: \t" + randVal1 + ' ' + TS1);
Console.WriteLine("Dice 2: \t" + randVal2 + ' ' + TS2);
Console.WriteLine("-----------------");
return randVal1 + randVal2;
}
static void Main()
{
for(int i = 1; i<=10;i++)
{
Console.WriteLine("Dice Roll #" + i);
Console.WriteLine("Dice Sum:\t" + ThrowDice());
Console.WriteLine();
}
}
}
现在,这就是我运行时的结果:
Dice Roll#1
骰子1:1 / TimeStamp:201308260146259075
骰子2:2 / TimeStamp:201308260146259131
骰子总数:3
Dice Roll#2
骰子1:2 / TimeStamp:201308260146259135
骰子2:5 / TimeStamp:201308260146259135
骰子总数:7
Dice Roll#3
骰子1:2 / TimeStamp:201308260146259135
骰子2:5 / TimeStamp:201308260146259135
骰子总数:7
Dice Roll#4
骰子1:2 / TimeStamp:201308260146259135
骰子2:5 / TimeStamp:201308260146259135
骰子总数:7
Dice Roll#5
骰子1:2 / TimeStamp:201308260146259135
骰子2:5 / TimeStamp:201308260146259135
骰子总数:7
Dice Roll#6
骰子1:2 / TimeStamp:201308260146259135
骰子2:5 / TimeStamp:201308260146259135
骰子总数:7
Dice Roll#7
骰子1:2 / TimeStamp:201308260146259135
骰子2:5 / TimeStamp:201308260146259135
骰子总数:7
Dice Roll#8
骰子1:2 / TimeStamp:201308260146259135
骰子2:5 / TimeStamp:201308260146259135
骰子总数:7
Dice Roll#9
骰子1:2 / TimeStamp:201308260146259135
骰子2:5 / TimeStamp:201308260146259135
骰子总数:7
Dice Roll#10
骰子1:2 / TimeStamp:201308260146259135
骰子2:5 / TimeStamp:201308260146259135
骰子总数:7
-Roll 1是完美的
-Roll 2 /骰子1 ...完美,
-Roll 2 /骰子2 ...... WTH ???
这些结果真的很奇怪,我期望在每个卷上获得不同的时间戳和不同的值。 timeStamp是什么想法我想出来检查生成这些数字的时间,看起来两个“骰子”同时滚动,看起来像“随机”使用时钟生成种子。
我甚至尝试使用DiceRoll()方法为骰子创建一个完整的类,但即使在那里,两个完全不同的对象我只是一遍又一遍地得到相同的结果..
我如何解决这个问题?,任何想法?
答案 0 :(得分:4)
Random
与默认构造函数一起使用时,将时间用作种子。使用相同的种子,您每次都会得到相同的结果。由于您连续多次创建新的Random
,因此每个都将以相同的种子开始,因此生成相同的数字。要解决此问题,请只使用一个Random
并重复使用。
另外,你可能知道这一点,但由于这是一个常见的错误,并且大多数骰子都来自1-6,我觉得我应该指出Random.Next
使用和独占上限,所以目前你只得到1-5的数字。
答案 1 :(得分:0)
将 Rand 声明为静态变量,并将其初始化为
using System;
class Program
{
public static String GetTimestamp()
{
DateTime saveNow = DateTime.Now;
return saveNow.ToString("yyyyMMddHHmmssffff");
}
public static int ThrowDice()
{
int randVal1, randVal2;
string TS1, TS2;
randVal1 = rand.Next(1,7);
TS1 = GetTimestamp();
randVal2 = rand.Next(1,7);
TS2 = GetTimestamp();
Console.WriteLine("Dice 1: \t" + randVal1 + ' ' + TS1);
Console.WriteLine("Dice 2: \t" + randVal2 + ' ' + TS2);
Console.WriteLine("-----------------");
return randVal1 + randVal2;
}
static Random rand ;
static void Main()
{
rand = new Random();
for(int i = 1; i<=10;i++)
{
Console.WriteLine("Dice Roll #" + i);
Console.WriteLine("Dice Sum:\t" + ThrowDice());
Console.WriteLine();
}
}
}
时间戳对于几个卷而言可以是相同的,但不是那么多奇怪的