精品项目

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) {

js一副扑克牌判断顺子—扑克牌顺子概率

return false;

// 排序数字数组

values.sort((a, b) => a

  • b);
  • // 检查是否连续

    let isConsecutive = true;

    for (let i = 1; i

    if (values[i] !== values[i

  • 1] + 1) {
  • 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

  • b);
  • isConsecutive = true;

    for (let i = 1; i

    if (adjustedValues[i] !== adjustedValues[i

  • 1] + 1) {
  • 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

  • 0.5);
  • 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万次模拟

    理论概率说明

  • 一副标准扑克牌有52张,抽取5张牌的总可能组合数为 \\( C(52,5) = 2,598,960 \\)。
  • 顺子的数量为10种点数序列(从A-2-3-4-5到10-J-Q-K-A),每种序列有 \\( 4^5 = 1024 \\) 种花色组合,所以顺子总数为 \\( 10 \ imes 1024 = 10,240 \\)。
  • 理论概率为 \\( \\frac{10240}{2598960} \\approx 0.00394 \\) 或 \\( 0.394\\% \\)。
  • 运行结果示例

    运行上述代码后,控制台输出将显示示例牌的判断结果和模拟概率。模拟概率会接近理论概率,但可能因随机性略有偏差。

    您可以直接在浏览器控制台中运行此代码,或将其嵌入HTML文件执行。

    AApoker下载