2012-01-21 81 views
4

所以我试图用“下雨绿色代码”来创建一个类似矩阵的程序。一切都进展良好,直到我决定将所有字符串实例放入列表并从中进行绘制/更新。为了达到适当的效果,我需要随机化几件事情。多个对象的随机数生成

所有字符串都被创建并存储在您在for循环中看到的列表中。间隔和下降速度的随机数字会改变字符串下落的速度,以及单个字符以什么速度在精灵表中旋转。

出于某种原因,虽然我只是得到一面文字的墙壁,并且所有的精灵都以相同的速度旋转。这些类和它们各自的功能可以工作......所以问题是我在做什么我的随机数初始化错了?

for (int i = 0; i < (wWidth/30); i++) 
{ 
    Random random = new Random(new System.DateTime().Millisecond); 
    float randInterval = NextFloat(random); 
    int dropSpeed = random.Next(1, 7); 
    _msList.Add(new MatrixString(chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10)); 
    xOff = i * 32; 
} 
+6

您需要在'for'循环之外创建您的随机实例。 –

回答

6

您需要创建random实例的for外循环:

Random random = new Random(new System.DateTime().Millisecond); 
for (int i = 0; i < (wWidth/30); i++) 
{ 
    float randInterval = NextFloat(random); 
    int dropSpeed = random.Next(1, 7); 
    _msList.Add(new MatrixString( 
       chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10)); 
    xOff = i * 32; 
} 

在很短的运行循环,与new System.DateTime().Millisecond播种将产生相同种子价值。因此,相同的随机数。

+1

也可以注意到Random的无参构造函数使用系统时间作为种子,所以创建一个新的'DateTime'可能不需要(只需要执行'new Random()')。 –

+0

我可能会SWORN我试过这个......它确实工作谢谢你们。 –

+0

不要担心这是一个相当常见的错误,在我上一个游戏项目中,几乎设计团队中的每个脚本编写者每次需要一个随机数时都会重新发送随机数生成器。而使事情变得更糟的是他们使用的Time()方法被破坏了,所以种子总是一样的。这是一个MMO,他们没有注意到它被破坏,因为服务器运行了好几天,所以当有人登录它时已经运行了足够长的时间,以至于它不明显,除了每次都重新播放的情况。无论如何,我现在在散漫。 –

2

你的循环是“快”,因此为每个回路是快于1毫秒的new Random(new System.DateTime().Millisecond)总是会产生相同的结果 - 以下应该工作:

Random random = new Random(new System.DateTime().Millisecond); 
for (int i = 0; i < (wWidth/30); i++) 
{ 
    float randInterval = NextFloat(random); 
    int dropSpeed = random.Next(1, 7); 
    _msList.Add(new MatrixString(chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10)); 
    xOff = i * 32; 
}