2013-08-04 15 views
-3

每当我的应用程序选择一个“随机”卡,它总是遵循相同的奇怪模式:俱乐部只有1-3,钻石4-6,心脏7-9,黑桃10 -12。西装永远在这个数字范围内,永不改变。每个套房应该被允许去13!请帮我解决令人困惑的问题,谢谢!Random.Next不会达到最大参数

来源:

Random Suite = new Random(); 
    Random Value = new Random(); 
    int sprod; 
    int vprod; 

    public Card RandomCardDraw() 
    { 
     sprod = Suite.Next(1, 5); 

     Card newc = new Card(); 

     newc.x = sprod; 

     vprod = Value.Next(1, 13); 

     if (sprod == 1) 
     { 
      newc.suite = CardSuites.Club; 

      newc.y = vprod; 

      switch (vprod) 
      { 
       case 1: 
        newc.cardval = CardValues.Ace; 
        return newc; 
       case 2: 
        newc.cardval = CardValues.Two; 
        return newc; 
       case 3: 
        newc.cardval = CardValues.Three; 
        return newc; 
       case 4: 
        newc.cardval = CardValues.Four; 
        return newc; 
       case 5: 
        newc.cardval = CardValues.Five; 
        return newc; 
       case 6: 
        newc.cardval = CardValues.Six; 
        return newc; 
       case 7: 
        newc.cardval = CardValues.Seven; 
        return newc; 
       case 8: 
        newc.cardval = CardValues.Eight; 
        return newc; 
       case 9: 
        newc.cardval = CardValues.Nine; 
        return newc; 
       case 10: 
        newc.cardval = CardValues.Ten; 
        return newc; 
       case 11: 
        newc.cardval = CardValues.Jack; 
        return newc; 
       case 12: 
        newc.cardval = CardValues.Queen; 
        return newc; 
       case 13: 
        newc.cardval = CardValues.King; 
        return newc; 
      } 
     } 
     if (sprod == 2) 
     { 
      newc.suite = CardSuites.Diamond; 

      newc.y = vprod; 

      switch (vprod) 
      { 
       case 1: 
        newc.cardval = CardValues.Ace; 
        return newc; 
       case 2: 
        newc.cardval = CardValues.Two; 
        return newc; 
       case 3: 
        newc.cardval = CardValues.Three; 
        return newc; 
       case 4: 
        newc.cardval = CardValues.Four; 
        return newc; 
       case 5: 
        newc.cardval = CardValues.Five; 
        return newc; 
       case 6: 
        newc.cardval = CardValues.Six; 
        return newc; 
       case 7: 
        newc.cardval = CardValues.Seven; 
        return newc; 
       case 8: 
        newc.cardval = CardValues.Eight; 
        return newc; 
       case 9: 
        newc.cardval = CardValues.Nine; 
        return newc; 
       case 10: 
        newc.cardval = CardValues.Ten; 
        return newc; 
       case 11: 
        newc.cardval = CardValues.Jack; 
        return newc; 
       case 12: 
        newc.cardval = CardValues.Queen; 
        return newc; 
       case 13: 
        newc.cardval = CardValues.King; 
        return newc; 
      } 
     } 
     if (sprod == 3) 
     { 
      newc.suite = CardSuites.Heart; 

      newc.y = vprod; 

      switch (vprod) 
      { 
       case 1: 
        newc.cardval = CardValues.Ace; 
        return newc; 
       case 2: 
        newc.cardval = CardValues.Two; 
        return newc; 
       case 3: 
        newc.cardval = CardValues.Three; 
        return newc; 
       case 4: 
        newc.cardval = CardValues.Four; 
        return newc; 
       case 5: 
        newc.cardval = CardValues.Five; 
        return newc; 
       case 6: 
        newc.cardval = CardValues.Six; 
        return newc; 
       case 7: 
        newc.cardval = CardValues.Seven; 
        return newc; 
       case 8: 
        newc.cardval = CardValues.Eight; 
        return newc; 
       case 9: 
        newc.cardval = CardValues.Nine; 
        return newc; 
       case 10: 
        newc.cardval = CardValues.Ten; 
        return newc; 
       case 11: 
        newc.cardval = CardValues.Jack; 
        return newc; 
       case 12: 
        newc.cardval = CardValues.Queen; 
        return newc; 
       case 13: 
        newc.cardval = CardValues.King; 
        return newc; 
      } 
     } 
     if (sprod == 4) 
     { 
      newc.suite = CardSuites.Spade; 

      newc.y = vprod; 

      switch (vprod) 
      { 
       case 1: 
        newc.cardval = CardValues.Ace; 
        return newc; 
       case 2: 
        newc.cardval = CardValues.Two; 
        return newc; 
       case 3: 
        newc.cardval = CardValues.Three; 
        return newc; 
       case 4: 
        newc.cardval = CardValues.Four; 
        return newc; 
       case 5: 
        newc.cardval = CardValues.Five; 
        return newc; 
       case 6: 
        newc.cardval = CardValues.Six; 
        return newc; 
       case 7: 
        newc.cardval = CardValues.Seven; 
        return newc; 
       case 8: 
        newc.cardval = CardValues.Eight; 
        return newc; 
       case 9: 
        newc.cardval = CardValues.Nine; 
        return newc; 
       case 10: 
        newc.cardval = CardValues.Ten; 
        return newc; 
       case 11: 
        newc.cardval = CardValues.Jack; 
        return newc; 
       case 12: 
        newc.cardval = CardValues.Queen; 
        return newc; 
       case 13: 
        newc.cardval = CardValues.King; 
        return newc; 
      } 
     } 
     else 
     { 
      return newc; 
     } 
     return newc; 
    } 
+1

如果甲板上有1000张卡片,你会怎么做? – I4V

+0

这是处于非常早期的发展阶段,我计划在稍后实施更优雅的系统:) – user2649633

+0

即使按照您的预期工作,“.Next(1,13)”永远不会返回13. –

回答

1

您正在运行到上,很多人有Random问题稍有不同。默认构造函数使用基于Environment.TickCount的种子进行初始化。如果您快速创建两个实例,它们将以相同的种子结束,因为系统计时器尚未更新。因此这两个实例都产生相同的数字序列。 Next(int,int)做了一些由受保护的Sample方法生成的double的简单缩放比例。只需使用一个随机实例并调用Next(1,5)Next(1,13)即可。

+0

谢谢你的回答 – user2649633

+0

@ user2649633它实际上应该是'Next(1,14)'来得到范围1 - 13 –

0

如果CardValuesCardSuites是枚举,所有的代码,可以有效地替换

static Random random = new Random(); 

static Card RandomCardDraw() 
{ 
    var suite = random.Next(5); 
    var value = random.Next(14); 
    return Card 
    { 
      x = suite + 1, 
      y = value + 1, 
      suite = (CardSuites)suite, 
      cardval = (CardValues)value, 
    }; 
} 

注:

你只需要一个Random实例。同时创建的两个实例将具有相同的种子并产生相关序列(如果提供相同的参数,则产生相同的序列)。

最后一个参数Random.Next()独家

+0

好的建议,我对编程非常陌生,所以我不完全理解所提出的概念,但它比我累赘的200多行代码好多了!谢谢! – user2649633

+0

更正为random.Next(5)和random.Next(14)。当使用单个参数时,最大值也是独占的。 –

+0

其实你也不需要两个'Next'。 'var rCard = random.Next(52); int suite = rCard/13; int cardVal = rCard%13;' –