2011-03-27 68 views
7


这是我如何使用随机数,但它总是给indexOfAChosenListCell提供“1”索引。
当我调试它,它表现出不同的值,但定期运行,每次我得到同样的举动..
什么是随机的问题,这是静态不是随机的... :)Random.Next不给随机数

internal Square getAutomaticMove()      
{ 
      List<Square> LegalMovesArray = GetLegalSquares(); 
      Random randomListCell = new Random(); 
      int indexOfAChosenListCell = 0; 

      if (CheckForLegalSquares())  
      { 
       indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1); 
      } 
+1

提示创建新的对象?另外,移动你的Random的外部构造getAutomaticMove() – 2011-03-27 00:50:31

+0

@Mitch:谢谢你的回答,但是LegalMovesArray.Count-1有什么问题,我想抛弃LegalMovesArray中的一个索引,它没有索引whi等于LegalMovesArray.Count ... – Mulder 2011-03-27 01:04:56

回答

4

我会建议播种随机数发生器。据我所知,每次运行应用程序时,您都会得到相同的伪随机数序列。我可能错了。

int Seed = (int)DateTime.Now.Ticks; 
Random randomListCell = new Random(Seed); 
+0

你是对的!没有你的两行它不工作.. – Mulder 2011-03-27 08:41:24

+8

这并没有什么区别* - 这是默认构造函数new Random()在内部完成的。关键是只初始化'randomListCell'一次,然后在这个实例上调用'Next()'。 – BrokenGlass 2011-03-27 16:03:06

+0

@BrokenGlass:我同意,他应该创建一个实例变量,并且你的答案是正确的。我不知道默认的构造函数会自动执行此操作。根据我的经验,我不得不种子。这不就是为什么有一个构造函数需要种子吗?我只是增加了对话。 – Anx 2011-03-27 17:31:52

5

Random.Next(Int32)

返回非负随机数小于指定的最大

所以你所得到的最大数字是Count - 2,可能不是你想要的。

+0

我想要一个数字从0到array-1的大小,这意味着最后一个单元格 – Mulder 2011-03-27 01:08:31

+0

@Mulder:那么你需要调用'randomListCell.Next(array.Length)',因为RNG将已经排除你通过它的值,不需要减去1. – 2011-03-27 01:28:31

4

将Random声明为私有成员变量,然后将其实例化为构造函数,并且只在方法中调用Random.Next。

3

你应该随机函数外创建

Random randomListCell = new Random(); 

internal Square getAutomaticMove()      
{ 
      List<Square> LegalMovesArray = GetLegalSquares(); 
      int indexOfAChosenListCell = 0; 

      if (CheckForLegalSquares())  
      { 
       indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1); 
      } 
21

使randomListCell一个实例变量,只有将其初始化一次 - 否则你将继续再次收到同样的号码。

MSDN

默认情况下,Random类的参 构造函数使用 系统时钟产生它的种子 价值,而它的参数 构造可以基于在一个Int32值 当前时间 中的刻度数。 然而,由于时钟具有有限的分辨率,使用参数构造来创建紧密相继 不同的随机的对象创建的随机数 发电机产生相同的随机数 序列。

3

每当你需要一个新号码时,不要创建一个新的Random;如果你想要一个不同的随机数序列,你需要保留一个Random对象,并重复地询问它。

2

我示区别:

var random = new Random(); 
var color = Color.FromArgb(200, random.Next(255), // 222 
           random.Next(255), // 33 
           random.Next(255)); // 147 

结果:#DE2193

var color = Color.FromArgb(200, new Random().Next(255), // 153 
           new Random().Next(255), // 153 
           new Random().Next(255)); // 153 

结果:#999999

0

声明Random对象之外的功能,使之使用相同的对象来生成新的号码。什么是LegalMovesArray.Count-1的值:您是在每天使用该相同的种子,让您大都相同数字的时间...

static Random randomListCell = new Random(); 
internal Square getAutomaticMove()      
{ 
      List<Square> LegalMovesArray = GetLegalSquares(); 

      int indexOfAChosenListCell = 0; 

      if (CheckForLegalSquares())  
      { 
       indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1); 
      } 
}