【问题标题】:C#/XNA pseudo-Random number creationC#/XNA 伪随机数创建
【发布时间】:2011-11-29 14:27:52
【问题描述】:

用于创建随机数的 c#/XNA 过程非常快速和简单,但是,它很可能是我见过的最糟糕的分发随机数生成器。 c#/XNA有没有更好的易于实现的方法?

rand.Next() 不适合我的需要。

来自:

静态私有随机 rand = new Random();

我在整个程序中随机放置对象。有时 10 个,有时 200 个。

当调用随机对象时(x val 和 y val 在二维平面上都是随机的),它们会分组。生成代码很干净,称它们为好,干净地迭代并为每个值提取一个新的随机数。但是他们分组,明显很糟糕,毕竟这对随机数来说不是很好。我是 c# 的中级技能,我是从 as3 跨过来的,它似乎更好地处理随机性。

我很清楚它们是伪随机的,但是在 Windows 系统上的 C# 中,分组是怪诞的。

【问题讨论】:

  • 你指的是哪个随机数生成过程? System.Random ?
  • 我更新了,提供了更多信息。还有强制性的呻吟+抱怨。

标签: c# random numbers xna-4.0


【解决方案1】:

你可以使用 XNA 的System.Security.Cryptography.RandomNumberGenerator 吗?

var rand = RandomNumberGenerator.Create();
byte[] bytes = new byte[4];

rand.GetBytes(bytes);

int next = BitConverter.ToInt32(bytes, 0);

获取最小/最大范围内的值:

static RandomNumberGenerator _rand = RandomNumberGenerator.Create();

static int RandomNext(int min, int max)
{
    if (min > max) throw new ArgumentOutOfRangeException("min");

    byte[] bytes = new byte[4]; 

    _rand.GetBytes(bytes);

    uint next = BitConverter.ToUInt32(bytes, 0);

    int range = max - min;

    return (int)((next % range) + min);
}

【讨论】:

  • 如何设置该方法的最小值和最大值?
  • 您能举例说明您的最小值/最大值是多少吗?
  • 0-10、1-200、-100-100,标准的东西。
  • @SimpleRookie - 请查看我的编辑。我添加了代码以获取范围内的随机数。我很好奇分布是否比标准的Random.Next更好。
  • 是的。在我测试过的所有情况下,它都好得多。
【解决方案2】:

对于我的项目,我使用简单的 XOR 算法。我不知道它分配数字有多好,但它很容易实现:

http://www.codeproject.com/KB/cs/fastrandom.aspx

【讨论】:

    【解决方案3】:

    这也可能取决于您使用System.Random 的方式。作为一般规则,一遍又一遍地创建 Random 的新实例并不是一个好主意,因为在大约同一时间创建的 Random 对象很可能会以相同的随机数作为种子(默认情况下,时间是用作种子。)相反,创建一个 Random 实例并在整个程序中仅使用该实例。

    除非目标是安全性(此处可能不是这种情况),否则最好使用System.Random

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 2011-06-02
      相关资源
      最近更新 更多