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

如何编写循环随机生成器:遍历完消息数组前不重复抽取条目

名言生成器无重复抽取方案

实现逻辑

  • 保留原始名言数组作为不可修改的基准数据源,用于重置抽取池
  • 额外维护一个动态的剩余可抽取列表,每次抽取后移除已展示的条目
  • 剩余列表为空时,自动用基准数据源重置列表,开启新一轮抽取

修复后完整代码

JS代码

let btn = document.getElementById('btn');
let output = document.getElementById('output');

// 原始名言基准库,固定不做修改
const originalQuotes = [
  '人无完人——这就是铅笔自带橡皮擦的原因。- 沃尔夫冈·里贝',
  '不要惧怕完美,你永远都达不到它。- 萨尔瓦多·达利',
  '再高的山也是由小石头堆成的。- 《一拳超人》引言',
  '先跑通,再优化,最后提性能,永远遵守这个顺序!- kiraa',
  '优秀的程序员即使过单行道也会左右都看一眼。- 道格·林德',
  '如果说调试是移除软件bug的过程,那编程就是把bug写进去的过程。- 艾兹格·W·迪杰斯特拉',
];
// 剩余可抽取列表,初始为基准库的拷贝
let availableQuotes = [...originalQuotes];

btn.addEventListener('click', function() {
  // 剩余列表为空时自动重置
  if (availableQuotes.length === 0) {
    availableQuotes = [...originalQuotes];
  }
  // 随机生成剩余列表范围内的索引
  const randomIndex = Math.floor(Math.random() * availableQuotes.length);
  // 取出对应名言
  const randomQuote = availableQuotes[randomIndex];
  // 展示内容
  output.innerHTML = randomQuote;
  // 从剩余列表中移除已抽取的条目,避免重复
  availableQuotes.splice(randomIndex, 1);
})

CSS代码(修复了原代码中output选择器缺失#导致样式不生效的问题)

#container {
  background-color: mediumpurple;
  border: 5px solid white;
  height: 300px;
  width: 700px;
  margin: 0 auto;
  text-align: center;
  border-radius: 25px;
}
#btn {
  margin:  50px auto;
  height: 50px;
  width: 250px;
  font-size: 20px;
  background-color: white;
  font-family: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;
  border-radius: 30px;
}

#output {
  margin: 25px auto;
  font-size: 20px;
  color: white
}

HTML代码

<div id="container">
  <button id="btn">获取你的今日寄语</button>

  <div id="output">点击按钮试试 :)</div>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:39:03