【问题标题】:Random number generation for multiple objects多个对象的随机数生成
【发布时间】:2012-01-21 13:52:34
【问题描述】:

所以我正在尝试使用“下雨的绿色代码”创建一个类似矩阵的程序。一切都很顺利,直到我决定将所有字符串实例放入一个列表并从中绘制/更新。为了达到正确的效果,我需要随机化一些东西。

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

由于某种原因,虽然我只是得到一堵同时掉落的文字墙,并且所有精灵都以相同的速度旋转。这些类及其各自的功能确实有效......所以问题是我的随机数初始化做错了什么?

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;
}

【问题讨论】:

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

标签: c# random xna


【解决方案1】:

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

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 播种将创建相同的种子值。因此,相同的随机数。

【讨论】:

  • 还可以注意到Random 的无参数构造函数使用系统时间作为种子,因此可能不需要创建一个新的DateTime 来传入(只需执行new Random() )。
  • 别担心,这是一个相当常见的错误,在我的上一个游戏项目中,几乎设计团队中的每个脚本编写者每次需要随机数时都会重新设置随机数生成器。更糟糕的是,他们使用的 Time() 方法被破坏了,所以种子总是一样的。这是一个 MMO,他们没有注意到它已经坏了,因为服务器运行了好几天,所以当有人登录时,它已经运行了足够长的时间,以至于它不被注意到,除了每次都重新播种的情况。不管怎样,我现在正在闲逛。
【解决方案2】:

您的循环是“快速”,因此new Random(new System.DateTime().Millisecond) 将始终提供相同的结果,因为每个循环都快于 1 毫秒 - 以下应该可以工作:

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;
}

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多