2010-10-13 107 views
0

我试图产生两个随机数,一个为一行,一个为列。正确实施C#的随机数生成器

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

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

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

举例来说,我只是在寻找10个号码的开出在这种情况下,16种可能性,这是输出是什么样子:

[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 

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

下面是相关代码:

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 

我发现它被特别是16x6的最大阵列(或96个记录哽咽了90条记录)

+0

我希望在'ReserveSeat'中没有竞赛条件... – icktoofay 2010-10-14 00:48:21

回答

4

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

要明白你为什么要这样做 - 看第一样品在http://msdn.microsoft.com/en-us/library/system.random.aspx

+0

将RandomlyAssignSeat从使用我自己的自定义RandomNumber方法更改为运行'Random random = new Random();'然后'row = random.Next(0,seatingArray.GetLength(0));'和'col = random.Next(0,seatingArray.GetLength(1));'工作得更快。谢谢。 – bafromca 2010-10-13 05:44:40

+0

断开链接.... – yonan2236 2010-10-13 05:59:51

+0

@ yonan2236:不,它的工作原理 – zerkms 2010-10-13 06:04:44

0

,或使随机的实例是独生子。你的RandomNumber方法的签名不会改变。