正确实现C#的随机数发生器

时间:2010-10-13 05:23:39

标签: c# random performance

我正在尝试生成两个随机数,一个用于行,一个用于列。

在这个确切的实例中,它是一个包含4行和4列的多维数组。因此,数字生成器可以对行和列使用值0到3。

我还必须确保没有重复点,所以如果第一次选择[0,0],则不能再次使用[0,0]。

当我实施我的解决方案并打印出结果时,C#需要 LONG 时间来生成一组有用的数字。

例如,在这种情况下,我只查找16种可能性中的10个数字,这就是输出的样子:

[1,1]
// {snip 26 times}
[3,3]
// {snip 76 times}
[0,0]
// {snip 83 times}
[2,2]
// {snip 69 times}
[0,0]
// {snip 84 times}
// {etc...}
[0,1] // which is a valid number

为什么连续84次将[0,0]作为一组随机数发现?它不使用我的系统的本地熵或什么?

以下是相关代码:

private static void RandomlyAssignSeat(string name, string[,] seatingArray)
{
    int row, col;

    // loop until seat is not reserved, then reserve it
    do
    {
        // generate random row
        row = RandomNumber(0,seatingArray.GetLength(0));

        // generate random column
        col = RandomNumber(0,seatingArray.GetLength(1));

        Console.WriteLine("[" + row + "," + col + "]");
    } while (ReserveSeat(row, col, name, seatingArray) == false);
} // end method RandomlyAssignSeat

使用RandomNumber看起来像这样:

private static int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max);
} // end method RandomNumber

我发现它特别被90条记录所阻塞,最大数组为16x6(或96条记录)

2 个答案:

答案 0 :(得分:4)

Random中创建一次RandomlyAssignSeat个实例,并将其作为参数传递给RandomNumber函数。

要了解您应该这样做的原因 - 请查看http://msdn.microsoft.com/en-us/library/system.random.aspx

处的第一个示例

答案 1 :(得分:0)

或使Random实例成为单例。 RandomNumber方法的签名不会改变。