我正在创建一个用于抽奖的2D数组。基本上它是一组2个整数:
int[,] coupon = new int[rowAmount, numAmount];
其中rowAmount
是行数,numAmount
是该行中的数字量。
现在我需要为每一行选择数字,但是在特定行中可能没有重复数字。
for (int r = 0; r < rowAmount; ++r)
{
for (int n = 0; n < numAmount; ++n)
{
userNum = lotRng.Next(1, numAmount * rngMult);
while (COUPON CONTAINS DUPLICATE NUMBER ON SECOND SPOT )
{
userNum = lotRng.Next(1, numAmount * rngMult);
}
coupon[r, n] = userNum;
}
}
我的问题是while部分,我无法弄清楚如何在第二个插槽(numAmount插槽)上检查coupon
是否包含userNum
。对于我过去只做list.Contains()
的列表和内容,但这似乎并没有在这里工作。
答案 0 :(得分:0)
根据阵列的大小,优化性能是有意义的。
取决于一种可能性是对数组进行排序并使用Array.BinarySearch。
你必须为此排序数组。
https://msdn.microsoft.com/en-us/library/2cy9f6wb(v=vs.110).aspx
因此,您可以通过多种方式优化数据结构。
答案 1 :(得分:0)
包含一系列列表的解决方案是我最喜欢的解决方案之一。它与我的另一个非常类似于锯齿状阵列但更快 - 因为列表搜索效率最高而Linq搜索不是。
const int rowAmount = 1000;
const int numAmount=1000;
const int rngMult = 10;
Random lotRng = new Random();
var coupon = new List<int>[rowAmount];
int userNum;
for (int r = 0; r < rowAmount; r++)
{
coupon[r]= new List<int>();
for (int n = 0; n < numAmount; ++n)
{
do userNum = lotRng.Next(1, numAmount * rngMult);
while (coupon[r].Contains(userNum));
coupon[r].Add(userNum);
}
}
当然,如有必要,也可以使用列表列表(某种2D列表)。
var couponLoL = new List<List<int>>();
以下快速和脏的方式显示了将2D数组复制到列表的可能方法,但由于多种原因(环路,值为拳击类型)不推荐这里:
var coupon= new int[rowAmount,numAmount];
[..]
do userNum = lotRng.Next(1, numAmount * rngMult);
while (coupon.Cast<int>().ToList().Contains(userNum));
在这种特殊情况下,它更没意义,因为这将在整个2D数组中查找double值。但是值得知道如何从2D转换为1D数组(然后在列表中)。
答案 2 :(得分:-1)
正如您在评论中所说,您需要检查所有n个字段与新的userNum。您可以使用以下代码解决此问题:
<?php
function aduna($a,$b){
$d=$a+$b;}
$d=aduna(2,3);
var_dump($d);
?>
我希望这对你有所帮助。