js一副扑克牌判断顺子—扑克牌顺子概率
以下是使用JavaScript判断扑克牌顺子并计算顺子概率的完整代码。代码包括两个主要部分:一是判断一手牌是否为顺子的函数,二是通过模拟随机抽取计算顺子概率的函数。我也提供了理论概率的计算结果。
代码说明
1. 判断顺子函数 `isStraight(cards)`:该函数接受一个扑克牌字符串数组(如 `['2H', '3D', '4S', '5C', '6H']`),检查是否为顺子。处理了A作为1或14的特殊情况,并确保点数唯一。
2. 模拟概率计算:生成一副标准扑克牌,随机抽取5张牌多次,统计顺子出现的频率,并与理论概率比较。
JavaScript代码
javascript
// 判断 判断一手牌是否为顺子
function isStraight(cards) {
// 点数到数字的映射
const valueMap = {
'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'10': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14
};
// 提取每张牌的点数并转换为数字
let values = cards.map(card => {
// 移除花色部分,获取点数(适应 '10' 这样的两位数)
let valueStr = card.length === 2 ? card[0] : card.slice(0, 2);
return valueMap[valueStr];
});
// 检查点数是否唯一
if (new Set(values).size !== 5) {
return false;
// 排序数字数组
values.sort((a, b) => a
// 检查是否连续
let isConsecutive = true;
for (let i = 1; i
if (values[i] !== values[i
isConsecutive = false;
break;
if (isConsecutive) {
return true;
// 如果不连续且包含A(14),尝试将A视为1
if (values.includes(14)) {
let adjustedValues = values.map(v => v === 14 ? 1 : v);
adjustedValues.sort((a, b) => a
isConsecutive = true;
for (let i = 1; i
if (adjustedValues[i] !== adjustedValues[i
isConsecutive = false;
break;
if (isConsecutive) {
return true;
return false;
// 生成一副标准扑克牌
function createDeck {
const suits = ['H', 'D', 'C', 'S']; // 花色: 红心、方块、梅花、黑桃
const ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
let deck = [];
for (let suit of suits) {
for (let rank of ranks) {
deck.push(rank + suit);
return deck;
// 从牌堆中随机抽取n张牌
function drawRandomHand(deck, n) {
let shuffled = [...deck].sort( => Math.random
return shuffled.slice(0, n);
// 计算顺子概率(通过模拟)
function calculateStraightProbability(simulations = 100000) {
const deck = createDeck;
let straightCount = 0;
for (let i = 0; i
let hand = drawRandomHand(deck, 5);
if (isStraight(hand)) {
straightCount++;
const simulatedProbability = straightCount / simulations;
const theoreticalProbability = 10240 / 2598960; // 理论概率
console.log(`模拟次数: ${simulations}`);
console.log(`顺子出现次数: ${straightCount}`);
console.log(`模拟概率: ${simulatedProbability.toFixed(6)} (${(simulatedProbability * 100).toFixed(2)}%)`);
console.log(`理论概率: ${theoreticalProbability.toFixed(6)} (${(theoreticalProbability * 100).toFixed(2)}%)`);
// 示例使用
console.log("--
let exampleHand1 = ['2H', '3D', '4S', '5C', '6H']; // 顺子
let exampleHand2 = ['10H', 'JD', 'QS', 'KC', 'AH']; // 顺子
let exampleHand3 = ['2H', '3D', '4S', '5C', '7H']; // 非顺子
console.log(`示例1 ${exampleHand1}: ${isStraight(exampleHand1)}`);
console.log(`示例2 ${exampleHand2}: ${isStraight(exampleHand2)}`);
console.log(`示例3 ${exampleHand3}: ${isStraight(exampleHand3)}`);
console.log("\
calculateStraightProbability(100000); // 运行10万次模拟
理论概率说明
运行结果示例
运行上述代码后,控制台输出将显示示例牌的判断结果和模拟概率。模拟概率会接近理论概率,但可能因随机性略有偏差。
您可以直接在浏览器控制台中运行此代码,或将其嵌入HTML文件执行。
AApoker下载