【问题标题】:C# System.Random Next comes out sortedC# System.Random Next 出来排序
【发布时间】:2016-03-03 10:01:00
【问题描述】:

我正在尝试访问数组中的随机元素,但我使用的随机生成器一直按如下顺序给我数字:

数字总是按顺序排列,永远不会完全随机(即,下一个数字总是更大,直到达到最大值,然后再次从低数字开始)。这也可以是递增的或递减的。

我正在使用种子随机对象和 Random.Next(-100, 100)。 这与MSDN Random.Next page 上展示的行为不同

我能想到的是Unity打包的.Net版本没有最新的Random?有什么办法可以解决这个困惑吗?

//Example
//Seed and ods set before the Awake method is called
public int seed;
public GameObject[] pathPartOds;

Random random;
GameObject[] path;

void Awake () 
{
    random = new Random (seed);
}

void CreatePath (int length) 
{
    path = new GameObject[length];

    for (int i = 0; i < length; i++)
        path[i] = pathPartOds[random.Next (0, pathPartOds.length)];
}

使用了多个种子,它们都给出相同的结果,我一直在使用随机整数创建种子

【问题讨论】:

标签: c# random next


【解决方案1】:

您需要精确地一次创建Random 的实例,并将其作为参数传递到您的函数中,该函数会绘制一个随机数。

否则你会破坏生成器的统计属性,因为它是以系统(即非随机)方式播种的。这就解释了输出的分段单调性。

【讨论】:

  • 另外,请注意,您需要避免在同一实例上同时从多个线程调用 Next(以及所有其他方法)(使用 lock(myRandom) 或类似的东西)跨度>
  • 是的,大约同时从两个不同的线程创建两个Random 对象(使用默认构造函数)可能导致它们具有相同的种子,因此Next 序列是相同的-线。我有一个实用程序静态方法(带有适当的锁定),它返回一个Random 对象...第一次调用它时它使用Environment.TickCount 作为种子,然后它将存储序列中的第一个数字(使用@ 987654330@) 作为后续实例的种子。即使您同时创建多个Random 实例,它也能很好地工作并且与时间无关
  • 我漂亮的答案stackoverflow.com/questions/35701716/…的离谱插件。
  • 我认为代码有问题。不能保证序列是不相交的。如果您有时间,请尝试通过 diehard 测试运行它以了解统计随机性。我认为它将无法通过自相关检查。
  • @Bathsheba 我刚刚编写了一个测试并运行diehard test suite 使用相同的例程生成的 4000M uint 数据集(每个线程一个随机实例,每个线程写入 10000 个整数),我会说它非常正确地通过了所有 15 次测试(p 值分散,并且不一致地接近 0 或 1)。我应该寻找任何特定的测试吗? (抱歉,SO cmets 可能不是讨论这个问题的最佳场所?:/)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2023-03-14
  • 2011-12-29
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多