2012-04-20 64 views
3

我想获得一个唯一的随机数,但每次运行代码时我都会得到相同的数字。我会先获得14,然后是6,但我的列表中保存所有使用的数字似乎并没有工作。加入14手动工作,但是当我添加randInt它不起作用。“新的随机(x)”总是生成相同的数字?

const int numCards = 32; 
     List<int> usedCards = new List<int>(); 
     int randInt = 0; 
     Random rand = new Random(numCards); 
     usedCards.Add(14); 
     do 
     { 

      randInt = rand.Next(0, numCards); 
      MessageBox.Show(randInt.ToString(), "End Game", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 

     } 
     while (usedCards.Contains(randInt)); 

     usedCards.Add(randInt); 
+0

@Alexei:这是一个不同的错误 - 这是在每次使用作出新的'Random'。 – sarnold 2012-04-20 02:19:48

+0

@AlexeiLevenkov“几乎”,但这是更具体...。不过,一个好的相关问题。 – 2012-04-20 02:20:02

回答

17

替换:

Random rand = new Random(numCards); 

Random rand = new Random(); 

供给一个固定种子值(numCards总是具有相同的值)在Random constructor呼叫将导致预见可重现序列,其始终是相同的种子值是相同的,只是这样的(不太但仍在点是有效的):使用

enter image description here

例如固定的种子的1和绘图10数为0到100,我的机器上总是产生序列

24,11,46,77,65,43,35,94,10,64 

使用,另一方面没有种子值,该序列变得不可预知。

如果没有传入种子值,Random会根据当前时间生成一个新的种子值,这就是您想要得到一个新的随机数序列 - 只要您不以快速顺序再次初始化它,那就是为什么你应该重新使用Random实例,而不是每次重新创建它们。

+2

对不起,这需要包括这样的情况:http://xkcd.com/221/ – 2012-04-20 02:16:42

+0

@DavidZ .:更新,哈;-) – BrokenGlass 2012-04-20 02:27:01

+0

@大卫Z .:为什么?这根本不是一回事。 – jason 2012-04-20 02:27:26

3

Random Class

如果指定一个种子值Random类的构造函数,它会产生相同的序列每次。产生随机数序列的算法是确定性的。

如果使用不带参数的构造函数,Random对象将在当前时间使用种子值,因此只要时间种子值不同,使用此构造函数实例化的每个Random对象都将具有不同的随机数序列这很可能。

如果两个不同Random对象的初始化时间非常接近,您仍然可以从两个不同的Random对象获得相同的数字序列。

Random Constructor