【问题标题】:Two random number generators (card dealing)两个随机数发生器(发牌)
【发布时间】:2012-03-03 02:37:43
【问题描述】:

我的这部分代码需要帮助。这部分处理生成 2 个随机数并使用该随机数同时在 2 个标签框中的每一个中显示一张卡片。这里的问题是随机数没有正确生成,因此卡片没有​​正确显示(有重复,有时没有显示等)

我的代码基础: 让我们假设 h 是代码另一部分的变量,它是 1 到 53 之间的任意数字(每个数字都与一张卡片有关)。如果生成的随机数(不重复)与变量 h 匹配,则计时器停止。

所以它基本上就像有一副纸牌,然后将纸牌平均分配给 2 个人,但这里一旦与随机抽取的纸牌(数字)有关的数字匹配,就停止发牌。

(l3,l4 是标签名称) 全局变量:

    Random rng = new Random();
    List<Integer> generated = new ArrayList<Integer>();
    List<Integer> generated2 = new ArrayList<Integer>();
    int l3count;
    int l4count;
    int Ulim = 53;
    int Llim = 1;
    int next;
    int check;
    int h;
    int next2;
    int Ulim2 = 53;
    int Llim2 = 1;



final int p = h;
            int delay2 = 1000;
    final Timer timer2 = new Timer();
      timer2.schedule(new TimerTask(){
     public void run(){

      for (int i = 1; i < 53; i++)
    {
        while(true)
        {
             next = rng.nextInt(Ulim) + Llim;
            if (!(generated.contains(next)||generated.contains(next2)))
            {

                generated.add(next);
                break;
            }

            next2 = rng.nextInt(Ulim2) + Llim2;
            if (!(generated.contains(next)||generated.contains(next2)))
            {

                generated.add(next2);
                break;
            }


        }

        String a = Integer.toString(next);
            String c = "C:\\Users\\mycompname\\Desktop\\deck\\"+a+".png";

             String d = Integer.toString(next2);
            String e = "C:\\Users\\mycompname\\Desktop\\deck\\"+d+".png";

            for(int j = 1;j<=53;j++)
            {
            if(j%2==0)
            {l3.setIcon(new ImageIcon(c));
           }
            else
            {l4.setIcon(new ImageIcon(e));    
           }
            }


            if(next==p||next2==p)
            check=10;    
          break;
    }
      if(check==10)
      timer2.cancel();
    timer2.purge();
      }

      },delay2, 1000);

任何帮助将不胜感激。 感谢您的宝贵时间。

【问题讨论】:

  • FFS 正确格式化您的代码 - 这是一团糟。如果您需要帮助,请帮助我们通过使其可读性来帮助您,并向您的观众表示尊重

标签: java random numbers generator


【解决方案1】:

你最好随机发牌。

使用O(n)Knuth Shuffle,您可以一次将一张卡片从一个阵列传递到另一个阵列。

您将卡片传递给的每个新阵列都将是不同人的手。

继续从牌组阵列中一次向每个阵列添加 1 张牌,直到每个玩家拥有您的规则所需的牌数。

另外,不要依赖随机数相等。见stupid-sort。寻找其他模式。就像随机数量的卡片 %cards_left 一样,您应该停止发放卡片。

根据要求更新代码示例

public static void shuffle (int[] array) {
    for(int n = array.length; (n > 1);) {
        int k = gen.nextInt(n--);
        int temp = array[n];
        array[n] = array[k];
        array[k] = temp;
    }
}

【讨论】:

  • 你的意思是基本上使用这个:var rand = new Random(); for (int i = cards.Length - 1; i > 0; i--) { int n = rand.Next(i + 1); int temp = 卡片[i];卡[i] = 卡[n];卡[n] = 温度; }
  • 该死的两行代码! - :P - 我用代码示例更新了我的答案。
【解决方案2】:

明显的问题是Random.nextInt 生成一个数字 0(包括)和 n(不包括)。因此,当您传入 53 的限制时,您将生成 0 到 52 之间的值——即 53 个可能的值,并且没有那么多卡片。所以把上限改成52。

此外,正如其他答案所指出的那样,您遇到冲突(将同一张牌发给多手牌)等的原因是您不想随机选择牌。你实际上想随机洗牌。

尝试改用shuffle algorithm

【讨论】:

    猜你喜欢
    • 2019-12-15
    相关资源
    最近更新 更多