年会大屏幕抽奖系统,双屏可控

我下载了CSV模板文件之后,里面的内容显示都是问号。

这个显示正常吗?求指教

你用 Excel 导入 csv 格式数据,然后碰到编码选 utf-8 试试。

另外,修好了,可以重新下载一个模板文件试试,

是的,按一次键,一次性,出全部获奖名单。

另外,可以在手机上投屏到电视来用吗

之前用AI生成过一套抽奖算法,可以实现类似抽卡的效果。比如买了 50包饼干、100颗糖果、30块巧克力、10次买玩具的机会,每次随机抽,直到用完。

/**
 * 抽奖数据
 * @Key: 类目
 * @Value: 权重。数字越小,概率越低。原本是仿照抽卡游戏中的展示的概率。在本Demo中也可以理解成库存。
 */
let data = {
    "饼干":50,
    "糖果":100,
    "巧克力":30,
    "玩具":10,
}

/**
 * 权重抽奖函数,由 Gemini 生成
 * @param {Object} options - 格式为 {"类目名1": 权重数字, "类目名2": 权重数字, ...}, 权重越小,概率越低
 * @returns {string|null} - 返回抽中的类目名
 */
function lottery(options) {
  // 1. 获取所有类目的键名
  const keys = Object.keys(options);
  if (keys.length === 0) return null;

  // 2. 计算总权重 (Total Weight)
  const totalWeight = keys.reduce((sum, key) => sum + parseFloat(options[key]), 0);

  if (totalWeight <= 0) return null;

  // 3. 生成一个 0 到 总权重 之间的随机数
  let random = Math.random() * totalWeight;

  // 4. 遍历类目,通过累减确定随机数落下的区间
  for (const key of keys) {
    const weight = options[key];
    if (random < weight) {
      return key;
    }
    random -= weight;
  }

  // 万一由于浮点数精度问题没有返回,默认返回最后一个
  return keys[keys.length - 1];
}

// 抽卡业务

// 1.全部抽完
let keys = Object.keys(data);
for(let i=0; keys.some(item=> data[item] > 0 ) ;i++){
    let out = lottery(data);
    console.log(`第${i+1}次抽奖结果:`, out);
    data[out]--;
}

/*
// 2.抽奖一次
let out = lottery(data);
console.log(`抽奖结果:`, out);
// 视情况,是否需要减库存/概率
data[out]--;
// 查看库存
console.log(`库存:`, data);
*/

/*
// 3.抽奖10次
for(let i=0; i<10; i++){
    let out = lottery(data);
    console.log(`第${i+1}次抽奖结果:`, out);
    // 如果输入的是概率,而不是库存,删除下面这行代码
    data[out]--;
}
// 查看库存
console.log(`库存:`, data);
*/

打开浏览器,按F12,将代码中的data区域的内容改成自己的,粘贴到浏览器的开发者窗口控制台的tab中,回车就能运行了

可以用了,非常感谢博主的耐心指教。

可以自定义背景图吗?

可以自定义文字和图标。

感觉不如这个网站好。https://www.gachago.net/

哎呦,第一个砸场子的人来了。

博主 代码中有做 重复中奖 的限制吗

不会重复的

太牛了谢谢大佬分享