
privateint[]Bingos=newint[]...{23,7,11,32,9,17};//中奖的号码组
privateList<int[]>Tickets=newList<int[]>();//1000张废奖票
privateList<int[]>BingoTickets=newList<int[]>();//200张有奖奖票

/**////<summary>
///判断是否出现Bingo的直线
///</summary>
///<returns>返回是否出现Bingo的直线</returns>
privateboolIsBingoLine(int[]ALine)
...{
bool[]vExists=newbool[Bingos.Length];
for(inti=0;i<ALine.Length;i++)
for(intj=0;j<Bingos.Length;j++)
if(ALine[i]==Bingos[j])
...{
vExists[i]=true;
}
for(inti=0;i<vExists.Length;i++)
...{
if(!vExists[i])returnfalse;
}
returntrue;
}

/**////<summary>
///需要判断的+6+2条直线上的数字下标
///</summary>
privateint[,]bingoIndexs=newint[,]...{
...{00,01,02,03,04,05},
...{06,07,08,09,10,11},
...{12,13,14,15,16,17},
...{18,19,20,21,22,23},
...{24,25,26,27,28,29},
...{30,31,32,33,34,35},

...{00,06,12,18,24,30},
...{01,07,13,19,25,31},
...{02,08,14,20,26,32},
...{03,09,15,21,27,33},
...{04,10,16,22,28,34},
...{05,11,17,23,29,35},

...{00,07,14,21,28,35},
...{05,10,15,20,25,30},
};

/**////<summary>
///判断奖票是否中奖
///</summary>
///<paramname="ATicket">奖票数字排列</param>
///<returns>返回奖票是否中奖</returns>
privateboolIsBingoTicket(int[]ATicket)
...{
for(inti=0;i<14;i++)
...{
int[]vLine=newint[6];
for(intj=0;j<vLine.Length;j++)
...{
vLine[j]=ATicket[bingoIndexs[i,j]];
}
if(IsBingoLine(vLine))returntrue;
}
returnfalse;
}

/**////<summary>
///判断奖票是否重复
///</summary>
///<paramname="ATicket">奖票数字排列</param>
///<returns>返回奖票在列表中是否存在</returns>
privateboolExistsTicket(int[]ATicket)
...{
for(inti=0;i<Tickets.Count;i++)
...{
boolvExists=true;
for(intj=0;j<Tickets[i].Length;j++)
...{
if(Tickets[i][j]!=ATicket[j])
...{
vExists=false;
break;
}
}
if(vExists)returntrue;
}
returnfalse;
}

/**////<summary>
///随机产生一个组奖票
///</summary>
///<returns>返回奖票数字排列的数组</returns>
privateint[]RandomTicket()
...{
int[]vResult=newint[36];
for(inti=1;i<=vResult.Length;i++)//顺序得到-36的数组
...{
vResult[i-1]=i;
}
RandomvRandom=newRandom();
for(inti=0;i<vResult.Length;i++)//打乱顺序
...{
intj=vRandom.Next(vResult.Length-i);//随机抽取倒数i前面的数字
intt=vResult[j];
vResult[j]=vResult[vResult.Length-i-1];
vResult[vResult.Length-i-1]=t;
}
returnvResult;
}

/**////<summary>
///判断奖票是否重复
///</summary>
///<paramname="ATicket">奖票数字排列</param>
///<returns>返回奖票在列表中是否存在</returns>
privateboolExistsBingoTicket(int[]ATicket)
...{
for(inti=0;i<BingoTickets.Count;i++)
...{
boolvExists=true;
for(intj=0;j<BingoTickets[i].Length;j++)
...{
if(BingoTickets[i][j]!=ATicket[j])
...{
vExists=false;
break;
}
}
if(vExists)returntrue;
}
returnfalse;
}

/**////<summary>
///随机产生一张中将的奖票
///</summary>
///<returns>返回一张中将的奖票</returns>
privateint[]RandomBingoTicket()
...{
int[]vResult=newint[36];
//随机排列Bingos数组
int[]vBingos=newint[Bingos.Length];
Bingos.CopyTo(vBingos,0);
RandomvRandom=newRandom();
for(inti=0;i<vBingos.Length;i++)//打乱顺序
...{
intj=vRandom.Next(vBingos.Length-i);//随机抽取倒数i前面的数字
intt=vBingos[j];
vBingos[j]=vBingos[vBingos.Length-i-1];
vBingos[vBingos.Length-i-1]=t;
}
intvIndex=vRandom.Next(14);//随机一条线上填上Bingos号码
for(inti=0;i<6;i++)
...{
vResult[bingoIndexs[vIndex,i]]=vBingos[i];
}
List<int>vNumbers=newList<int>();
for(inti=1;i<=36;i++)
...{
boolvExists=false;
for(intj=0;j<Bingos.Length;j++)
...{
if(Bingos[j]==i)
...{
vExists=true;
break;
}
}
if(!vExists)vNumbers.Add(i);//添加Bingo号码之外的数字
}
for(inti=0;i<vResult.Length;i++)
...{
boolvExists=false;
for(intj=0;j<6;j++)//如果这个位置已经被填值
...{
if(bingoIndexs[vIndex,j]==i)
...{
vExists=true;
break;
}
}
if(!vExists)
...{
intj=vRandom.Next(vNumbers.Count);//从余下的数字中抽取一个
vResult[i]=vNumbers[j];
vNumbers.RemoveAt(j);//移出
}
}
returnvResult;
}

/**////<summary>
///判断一个数是否是奖号中的数
///</summary>
///<paramname="ANumber">测试数值</param>
///<returns>返回一个数是否是奖号中的数</returns>
privateboolIsBingoNumber(intANumber)
...{
for(inti=0;i<Bingos.Length;i++)
...{
if(ANumber==Bingos[i])
...{
returntrue;
}
}
returnfalse;
}
privatevoidbutton1_Click(objectsender,EventArgse)
...{
for(inti=0;i<1000;)//产生张废票
...{
int[]vTicket=RandomTicket();
if(ExistsTicket(vTicket)||IsBingoTicket(vTicket))
...{
continue;
}
else
...{
Tickets.Add(vTicket);
i++;
}
/**/////输出
Console.WriteLine("------无奖-------");
for(intj=0;j<vTicket.Length;j++)
...{
if(j%6==0)Console.WriteLine();
if(IsBingoNumber(vTicket[j]))
Console.Write("{0:00}*",vTicket[j]);
elseConsole.Write("{0:00}",vTicket[j]);
}
Console.WriteLine();
}
for(inti=0;i<200;)//产生张有奖奖票
...{
int[]vBingoTicket=RandomBingoTicket();
if(ExistsBingoTicket(vBingoTicket))
...{
continue;
}
else
...{
BingoTickets.Add(vBingoTicket);
i++;
}

/**/////输出
Console.WriteLine("-----有奖--------");
for(intj=0;j<vBingoTicket.Length;j++)
...{
if(j%6==0)Console.WriteLine();
if(IsBingoNumber(vBingoTicket[j]))
Console.Write("{0:00}*",vBingoTicket[j]);
elseConsole.Write("{0:00}",vBingoTicket[j]);
}
Console.WriteLine();
}
}
本文介绍了一个抽奖系统的实现细节,包括如何生成不重复且符合特定规则的奖票,如何判断奖票是否中奖,以及如何随机生成中奖和未中奖的奖票。通过具体的算法和流程,确保了抽奖过程的公平性和随机性。
1121

被折叠的 条评论
为什么被折叠?



