C#随机种子值int.MinValue不可预测

时间:2018-01-21 09:04:24

标签: c# random seed

所以我目前正在尝试测试一个使用随机函数的函数。为了测试它,我将种子值传递给C#Random函数。 (即System.Random)

我的测试用例涉及使用int.MaxValue和int.MinValue来进行边界测试。整数的最大值产生一致和预期的结果。但是当我尝试使用最小值时,下一个会产生无法预测的随机结果,因此无法进行测试。

我很好奇这是否是预期的,或者种子没有产生可预测结果的原因是什么。我错过了什么吗?

提前致谢。

编辑:

提供代码供参考。这些方法是我使用的数组扩展,以便将数组随机排序。我使用随机类来获得不同的结果并将我的种子作为可选参数传递以允许测试。

public static void Shuffle<T>(this T[] array, int seedValue = -1)
{
   // Create the randomizer that will be needed
   Random random = seedValue >= 0 ? new Random(seedValue) : new Random();

   // Run the algorithm
   for (int i = array.Length - 1; i > 0; i--)
   {
       // Get a random integer with a maximum of i
       int r = random.Next(i);

       // Swap the element at r with the element at i
       array.Swap(r, i);
   }
}

public static void Swap<T>(this T[] array, int indexOne, int indexTwo)
{
    // Check if the indices that we were passed are the same index
    if (indexOne == indexTwo)
    {
        return;
    }

    // Check that the first index is in range
    if (indexOne < 0 || indexOne >= array.Length)
    {
        throw new ArgumentOutOfRangeException("indexOne", "The first index provided is out of the range of the array provided.");
    }

    // Check that the second index is in range
    if (indexTwo < 0 || indexTwo >= array.Length)
    {
        throw new ArgumentOutOfRangeException("indexTwo", "The second index provided is out of the range of the array provided.");
    }

    // Swap the items
    T temp = array[indexOne];
    array[indexOne] = array[indexTwo];
    array[indexTwo] = temp;
}

所以这些是正在测试的方法。我将minvalue传递给Shuffle函数。经过对自己的进一步调查,它似乎与任何负面价值一起出现。它似乎产生不一致的结果。我目前在.NET 2.0中工作。旧版本我知道,但我在Unity内部工作。

2 个答案:

答案 0 :(得分:2)

这是你的问题:

Random random = seedValue >= 0 ? new Random(seedValue) : new Random();

如果传递的种子值小于零,则根本不使用它, 很自然地,随机种子从正在运行的计算机时钟中选择。

答案 1 :(得分:0)

如果检查Random类的源代码,可以在构造函数中找到以下行:

int subtraction = (Seed == Int32.MinValue) ?
       Int32.MaxValue : Math.Abs( Seed );

此检查表示如果Seed等于Int32.MinValue,则会使用MaxValue。这也意味着两者的结果应完全相同。