如何用java编写一个简单的随机扑克牌生成器?

如何用java编写一个简单的随机扑克牌生成器?,java,java.util.scanner,Java,Java.util.scanner,我正在尝试从牌和套牌中随机创建一个,因为你可以有红桃、黑桃、梅花或钻石的整数,也可以有红桃、黑桃、梅花或钻石的王牌。没有理由为脸牌和排名较低的牌设置单独的数组。制作一个卡阵列来保存所有卡值,另一个阵列来保存套装: import java.util.Scanner; import java.util.Random; public class blackJack { public static void main(String[] args){ Scanner input = new Sca

我正在尝试从牌和套牌中随机创建一个,因为你可以有红桃、黑桃、梅花或钻石的整数,也可以有红桃、黑桃、梅花或钻石的王牌。

没有理由为脸牌和排名较低的牌设置单独的数组。制作一个
阵列来保存所有卡值,另一个阵列来保存套装:

import java.util.Scanner;
import java.util.Random;
public class blackJack {
public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    int cards[] = {2,3,4,5,6,7,8,9,10};
    String card[] = {"H", "D", "C", "S"};
    String suit[] = {"A","K","Q","J"};
    //System.out.println(cards[2]);
    Random random = new Random();
    System.out.println(cards[random.nextInt(cards.length)] +card[random.nextInt(card.length)]);
}
}

如果你担心你的牌组的随机性。尝试一下fisher-yates洗牌算法

没有理由需要整数/字符串二分法,因为您永远不需要将它们视为整数-只需对所有值使用字符串即可

此外,您最好(从统计分布的角度)获得一个随机数,并使用该随机数选择两个值:

public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    String suits[] = {"H", "D", "C", "S"};
    String cards[] = {"2", "3", "4", "5", "6", "7", "8", "9", "10",
                      "J", "Q", "K", "A" };
    Random random = new Random();
    System.out.println(cards[random.nextInt(cards.length)]
        + suits[random.nextInt(suits.length)]);
}
但请记住,只有当你的鞋子里有无限多的牌组时,这种随机选牌方案才有效。赌场喜欢使用多个牌组来减少点卡的影响,但即使是它们也不能使用无限的牌组:-)

要正确模拟赌场,您需要创建一个包含
x
牌组的鞋子结构,您只需从中随机选择牌组进行交易(并从鞋子中取出)


然后,当鞋子在交易后达到一个确定的尺寸时(例如,降到原来尺寸的20%,这是赌场打牌的另一种方式),你可以重新调用“洗牌”——因为当你可以使用Fisher Yates按需洗牌时,你实际上不需要洗牌,根据我的另一个答案。

我试图让这个答案变得有趣(以一种积极的方式,不是d***),但后来我注意到一个可怕的eclipse bug

首先是答案(好的,不是答案,而是我的建议——只是不要担心rand函数,它很好)

现在,虫子-

Eclipse根本不接受心脏符号!如果我从中剪切粘贴,它只适用于所有其他套装,除了红心


所以我很抱歉。这是我能做的最好的了。

你已经回答了你的问题。怎么了?问题是关于卡片套装和值表示。哦,非常感谢,我忘了我不需要数字作为整数。@user3421518-如果您确实需要卡片值(我想您最终会需要,因为您的类名为“blackjack”:),那么您可以保留一个单独的卡片值数组(例如,
int[]值={2,3,4,5,6,7,8,9,10,10,10,11}
)。当然,您需要对ACE进行特殊处理,因为它们可以是1或11。或者只需将值放入
列表中并使用
集合。shuffle()
。正确。使用您的方法可以保证正确地洗牌。就我个人而言,我建议首先实现您自己的洗牌,以获得乐趣。:)从统计分布的角度来看,使用单个随机数如何改善情况?我觉得这与随机均匀地挑选一张牌的价值,然后随机均匀地挑选一套衣服。(或者你是否假设由
random
产生的序列号以某种方式相互关联?)@Ted,统计学家会对此进行辩论,但他们往往会争论:-)我有一些统计数据董事会告诉我,由于许多PRNG的工作方式,最好为一个值点击生成器一次,而不是两次点击并合并,部分原因是这符合从52张卡片中选择一张卡片的现实(如果分布是完美的,这可能无关紧要,但如果每秒钟的值都是偶数会怎么样).这就是我说may的原因。无论如何,我更愿意在我的回答中选择更好的解决方案,即模仿一只合适的鞋子,而不是假设每张牌的供应量是无限的。是的,理论上,每次结果打一次PRNG(如你所说,这很容易引起争议)但是,如果这确实是一个问题,那么就不应该使用
Random
,而应该使用更好的RNG,比如
java.security.SecureRandom
public static void main (String[] args) {
    Scanner input = new Scanner (System.in);
    String suits[] = {"H","D","C","S"};
    String cards[] = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
    Random random = new Random ();
    int num = random.nextInt (cards.length * suits.length);
    System.out.println (cards[num % cards.length] + suits[num / suits.length]);
}
public static void gen() {
        String card[] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        String suit[] = {"\u2661", "\u2662", "\u2663", "\u2660"};
        System.out.println(
                card[(int)(Math.random()*card.length)] 
                        +suit[(int)(Math.random()*suit.length)]);

}