【问题标题】:Properly implementing C#'s random number generator正确实现 C# 的随机数生成器
【发布时间】:2010-10-13 05:23:38
【问题描述】:

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

在这个确切的例子中,它是一个 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 条记录)

【问题讨论】:

  • 我希望ReserveSeat中没有竞争条件...

标签: c# random performance


【解决方案1】:

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

要了解为什么要这样做 - 查看http://msdn.microsoft.com/en-us/library/system.random.aspx的第一个示例

【讨论】:

  • 将 RandomlyAssignSeat 从使用我自己的自定义 RandomNumber 方法更改为运行 'Random random = new Random();'然后'row = random.Next(0,seatingArray.GetLength(0));'和 'col = random.Next(0,seatingArray.GetLength(1));'工作得更快。谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 2020-06-07
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2011-07-03
    • 2012-11-28
    相关资源
    最近更新 更多