从容器中抽出随机票

时间:2013-12-15 19:52:33

标签: c#

我正在抽奖,用户输入奖品并出售门票。每张门票都有买家和他的名字,电话等。我剩下的就是画一张中奖彩票并将奖品分配给它:

 {
    private Random draw = new Random();
    private List<Ticket> ticketContainer = new List<Ticket>();
    private List<Prize> prizes = new List<Prize>();

    public List<Prize> DoDraw()
    {
        int ticketCount = ticketContainer.Count;

        foreach (var prize in prizes)
        {
            int ticketNumber = draw.Next(1, ticketCount + 1);


        }
        return prizes;
        Console.WriteLine(prizes);
    }

我有这个代码,但是当我运行它时没有任何反应。我一直在寻找并试图找到答案但是已经停留了2天而且我还有更多方法。

3 个答案:

答案 0 :(得分:0)

是的,所以你正在绘制一个票号,然后对号码本身一无所知。当循环重新循环时,该值超出范围并永远消失。

从你的代码中我假设Prize包含某种获得它的Ticket的链接,所以你需要在循环中分配它。

否则,如果没有看到您的奖品类确认,就无法给出更好的答案。 (并告诉我们你期望发生什么)

答案 1 :(得分:0)

List是从零开始的,这意味着对于List Count n,索引从0变为n-1 }。

您的ticketNumber应该是draw.Next(0, ticketCount),或者draw.Next(ticketCount)

但是,一旦你拿到中奖号码,你也不会对ticketNumber做任何事情。

答案 2 :(得分:0)

您找到了一个索引,但实际上并没有对它做任何事情。

您还可以尝试将绘图设为一个单独的类,并为每个DoDraw返回并删除一张随机故障单。

 class Draw
 {
    private Random draw = new Random();
    private List<Ticket> ticketContainer = new List<Ticket>();
    private List<Prize> prizes = new List<Prize>();

    public Prize DoDraw()
    {
        int ticketCount = ticketContainer.Count;

        int ticketNumber = draw.Next(1, ticketCount + 1);

        var result = prizes[ticketNumber];
        prizes[ticketNumber] = prizes[prizes.Count - 1]; // Put last element in the returned elements place
        prizes.RemoveAt(prizes.Length - 1);
        return result;
    }

制作n抽奖将是

的问题
  Draw draw = // create it...
  for (var i = 0; i < n; i++) {
      var ticket = draw.DoDraw();
      Console.WriteLine(ticket); // Do something appropriate.
  }