java两个随机数生成器(卡交易)
我需要这部分代码的帮助。本部分涉及生成2个随机数,并使用该随机数同时在2个标签框中的每个框中显示一张卡。这里的问题是随机数没有正确生成,因此卡片没有正确显示(有重复,有时没有显示,等等)
我的代码的基本知识: 让我们假设h是代码另一部分的变量,它是介于1和53之间的任何数字(每个数字都与卡有关)。如果生成的随机数(非重复)与变量h匹配,则计时器停止
因此,这基本上就像拥有一副牌,然后将牌均匀地分发给两个人,但在这里,一旦随机抽取的一张牌(数字)的数字匹配,交易就会停止
(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);
任何帮助都将不胜感激。 谢谢你抽出时间
# 1 楼答案
你最好是随机出牌
使用
O(n)
Knuth Shuffle可以一次将一张卡从一个阵列传递到另一个阵列你将卡传递到的每个新阵列都将是不同的人的手牌
继续从牌组阵列中每次向每个阵列添加1张牌,直到每个玩家拥有规则要求的牌数
另外,不要依赖于随机数相等。见stupid-sort。寻找其他模式。就像随机数张剩下的卡一样,你应该停止发放卡
根据请求使用代码示例进行更新:
# 2 楼答案
明显的问题是Random.nextInt生成一个数字0(包含)和n(排除)。所以当你通过53的限制时,你会产生0到52之间的值-这是53个可能的值,并且没有那么多的卡片。因此,将上限改为52
另外,正如其他答案所指出的,你之所以会遇到冲突(将同一张牌交给多只手)是因为你不想随机选择牌。你实际上想要随机洗牌
尝试改用shuffle algorithm