两个随机数发生器(卡交易)

时间:2012-02-10 16:16:52

标签: java random numbers generator

我需要帮助我的这部分代码。这部分涉及生成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);

任何帮助将不胜感激。 谢谢你的时间。

2 个答案:

答案 0 :(得分:2)

你最好随意处理这些卡片。

使用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;
    }
}

答案 1 :(得分:1)

显而易见的问题是Random.nextInt生成数字0(包括)和n(不包括)。所以当你传入53的限制时,你会产生0到52之间的值 - 这是53个可能的值,并且没有那么多的牌。所以将上限改为52。

另外,正如其他答案所指出的那样,你遇到冲突的原因(将牌照交给多手牌)等等,你不想随意选择牌。你实际上想要随机洗牌。

请尝试使用shuffle algorithm