You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

卡牌游戏起手测试程序问题:统计Brigette出现次数异常

问题分析与修复方案

我来帮你排查代码里的问题,咱们一步步解决:

一、#stats按钮统计失效的核心问题

你的统计逻辑有三个关键bug:

  1. 循环变量冲突:外层10000次模拟的循环和内层取7张牌的循环都用了i当变量名。第一次内层循环跑完后,i的值变成7,外层循环的i <= 10000直接不满足,导致统计只执行了1次,根本没跑满10000次。
  2. 洗牌逻辑错误:你只在统计开始前shuffle了一次牌组,之后的所有模拟都用同一副洗好的牌,这完全不符合真实抽卡逻辑——每次模拟都应该重新洗牌再抽起手。
  3. 数组重置不彻底:虽然你用了sevenhand.length = 0清空数组,但更稳妥的方式是每次模拟都重新创建空数组,避免残留数据干扰统计。

二、#shuffle按钮出现undefined的问题

openingHand变量没有初始化,直接用+=拼接字符串时,初始值是undefined,所以开头会出现这个无效值,只要把它初始化为空字符串就能解决。

修复后的完整代码

$(document).ready(function() {
 function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex;
  while (0 !== currentIndex) {
   randomIndex = Math.floor(Math.random() * currentIndex);
   currentIndex -= 1;
   temporaryValue = array[currentIndex];
   array[currentIndex] = array[randomIndex];
   array[randomIndex] = temporaryValue;
  }
  // 返回数组副本,避免修改原始牌组
  return [...array];
 }

 let deckarray = ["Grubbin", "Grubbin", "Grubbin", "Charjabug", "Vikavolt", "Vikavolt", "Vikavolt", "Tapu LeLe", "Tapu LeLe", "Tapu Bulu", "Tapu Bulu", "Tapu Bulu", "Octillery", "Remoraid", "Remoraid", "N", "N", "N", "N", "Skyla", "Skyla", "Skyla", "Guzma", "Guzma", "Guzma", "Brigette", "Brigette", "Brigette", "Kukui", "Kukui", "Ultra Ball", "Ultra Ball", "Ultra Ball", "Ultra Ball", "Heavy Ball", "Rare Candy", "Rare Candy", "Rare Candy", "Rare Candy", "Choice Band", "Choice Band", "Choice Band", "Choice Band", "Float Stone", "Float Stone", "Energy Recycler", "Energy Recycler", "Field Blower", "Field Blower", "Lightning", "Lightning", "Lightning", "Lightning", "Grass", "Grass", "Grass", "Grass", "Grass", "Grass", "Grass" ];

 $('#shuffle').click(function() {
  $('#deck').empty();
  const shuffledDeck = shuffle(deckarray);
  var openingHand = ""; // 初始化空字符串解决undefined问题
  for (var i = 0; i < 7; i++) {
   openingHand += shuffledDeck[i] + "<br />";
  }
  $('#deck').append(openingHand);
 });

 $('#stats').click(function() {
  let brigettecount = 0;
  const totalSimulations = 10000;

  for (let sim = 0; sim < totalSimulations; sim++) {
   // 每次模拟都基于原始牌组重新洗牌
   const shuffledDeck = shuffle(deckarray);
   // 直接取前7张判断,不需要额外数组存储
   const hasBrigette = shuffledDeck.slice(0,7).includes("Brigette");
   if (hasBrigette) {
    brigettecount++;
   }
  }

  // 输出统计结果,可按需改成页面展示
  console.log(`模拟${totalSimulations}次,起手包含Brigette的次数:${brigettecount}`);
  console.log(`出现概率:${(brigettecount/totalSimulations*100).toFixed(2)}%`);
 });
});

额外优化建议

  1. 保护原始牌组:原代码的shuffle函数会直接修改传入的数组,我修复时改成返回数组副本,保证每次模拟都基于原始牌组操作,避免数据混乱。
  2. 简化统计逻辑:省去了sevenhand数组的中间存储,直接用slice(0,7)取前7张并判断,代码更简洁高效。
  3. 结果可视化:可以在页面加一个<div id="result"></div>,然后用$('#result').text(...)把统计结果展示出来,比只在控制台输出更直观,方便后续扩展多卡牌组合的统计展示。

内容的提问来源于stack exchange,提问作者JoeG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:00:32