卡牌随机生成方案:加权随机算法与词缀池设计实战(含Java示例)
最近在做一个卡牌玩法原型时遇到一个挺有意思的需求能不能让卡牌真正意义上“全部随机生成”而不是靠策划手动一张张配数值于是我把整套逻辑拆成了卡牌词缀池、随机算法、稀有度权重、生成校验四层结构来设计。本文整理了一套可复用的完整方案包含数据结构、加权随机算法、前缀后缀组合规则、批量生成验证思路和常见翻车点适合游戏开发入门者、想做随机装备系统的同学也适合对算法生成内容感兴趣的开发者。很多人一听到“卡牌随机生成”第一反应是“这不就是 random 一下吗有什么可讲的”。实际写起来会发现真正麻烦的不是“随机”本身而是“随机出来之后怎么保证可用”。如果完全无约束地随机一张卡牌可能同时带有互相矛盾的词缀也可能出现数值过于极端导致游戏失衡的问题。所以本文要讨论的“所有卡牌随机生成”不是毫无规则的瞎随机而是基于一套可配置的词缀库和数值区间的程序化生成。为了让你更容易理解我会拿一款简化版的卡牌游戏作为例子每张卡牌有名称、稀有度、职业限制、基础属性、词缀效果、描述文本其中名称和词缀由系统从词缀池中抽取组合基础属性根据稀有度生成整体流程完全可以跑通。你可以把这个方案直接移植到自己的项目里也可以在此基础上扩展出装备系统、技能随机生成甚至任务关卡奖励生成。1. 背景与核心概念1.1 随机生成卡牌解决什么问题传统卡牌设计中每张卡牌由策划或数值同学手动配置。这种方式在少量卡牌时没有问题但当游戏需要上千张卡牌、或需要大量临时活动奖励时手动配置的成本会变得非常高。卡牌随机生成的核心价值在于用一套规则批量产生大量卡牌。提高游戏内容的重复可玩性。让玩家每次获得卡牌时都有新鲜感。降低后续新增词缀、属性时的配置成本。换句话说随机生成并不是要替代策划的创意而是把“创意规则”沉淀成数据和代码然后由程序在规则边界内自动产出卡牌。1.2 程序化生成与纯随机的区别程序化生成Procedural Generation指的是用预设的规则、权重、数据池来生成内容Python、Java、C# 都可以实现。纯随机则是对所有参数做等概率的随机选择没有任何倾向和约束。举个例子如果从 1 到 100 里面随机出一个数作为攻击力这叫纯随机。但如果攻击力按照“普通 60%、稀有 30%、史诗 10%”的概率区间来抽取再在指定区间内浮动这就叫加权随机属于程序化生成的一部分。卡牌随机生成通常采用“加权随机 规则约束”的组合方式既能保证每次结果不同又能让结果处于合理范围。1.3 本文涉及的常用术语在进入代码之前先明确几个会用到的术语词缀挂在卡牌上的效果文本例如“火焰伤害 5”“生命偷取 2%”。稀有度卡牌品质通常分为普通、稀有、史诗、传说。前缀、后缀卡牌名称的组成部分例如“烈焰”“之盾”可以组合成“烈焰之盾”。词缀池所有可用词缀的集合。权重该选项被选中的概率相对大小。理解了这些术语之后我们正式搭建环境。2. 环境准备与版本说明本文的示例代码采用 Java 编写选择 Java 的原因是它的随机数 API 简单直接、类型系统比较适合表达卡牌数据结构读者也很容易迁移到 C# 或其他语言。2.1 开发环境项目说明JDK建议使用 JDK 8 及以上版本构建工具Maven 或直接使用 javac 命令编译IDEIntelliJ IDEA / Eclipse / VS Code 均可操作系统Windows / macOS / Linux 均可版本不需要严格绑定只要 JDK 8 即可重点演示随机生成的算法思路和数据结构设计。2.2 项目结构建议新建一个普通的 Java 工程目录结构如下card-generator ├── src │ └── main │ └── java │ └── com │ └── example │ └── card │ ├── Card.java │ ├── CardRarity.java │ ├── CardAffix.java │ ├── CardGenerator.java │ ├── RandomUtil.java │ └── Main.javaCard.java卡牌实体类。CardRarity.java稀有度枚举。CardAffix.java词缀类。CardGenerator.java核心生成器。RandomUtil.java加权随机工具类。Main.java入口演示类。如果你的项目用 Maven 管理只需要在pom.xml里留一个空项目依赖即可本文的示例不依赖第三方库全部使用 JDK 自带能力。3. 核心设计与算法拆解3.1 卡牌数据结构设计卡牌可以拆成几个核心字段唯一ID。名称由前缀 基础名 后缀组成。稀有度。职业限定可选。基础属性例如攻击力、防御力。词缀列表。卡牌描述文本。在 Java 里可以这样设计// 文件路径src/main/java/com/example/card/Card.java package com.example.card; import java.util.ArrayList; import java.util.List; public class Card { private String id; private String name; private CardRarity rarity; private String profession; private int attack; private int defense; private ListCardAffix affixes; public Card() { this.affixes new ArrayList(); } public String getId() { return id; } public void setId(String id) { this.id id; } public String getName() { return name; } public void setName(String name) { this.name name; } public CardRarity getRarity() { return rarity; } public void setRarity(CardRarity rarity) { this.rarity rarity; } public String getProfession() { return profession; } public void setProfession(String profession) { this.profession profession; } public int getAttack() { return attack; } public void setAttack(int attack) { this.attack attack; } public int getDefense() { return defense; } public void setDefense(int defense) { this.defense defense; } public ListCardAffix getAffixes() { return affixes; } public void setAffixes(ListCardAffix affixes) { this.affixes affixes; } Override public String toString() { return Card{ id id \ , name name \ , rarity rarity , profession profession \ , attack attack , defense defense , affixes affixes }; } }这里使用ArrayList来保存词缀列表方便后续动态添加多条词缀。3.2 稀有度枚举稀有度直接影响卡牌属性的上下限、词缀数量、出现权重。建议用枚举来表示避免到处写魔法字符串。// 文件路径src/main/java/com/example/card/CardRarity.java package com.example.card; public enum CardRarity { COMMON(普通, 10, 1), RARE(稀有, 30, 2), EPIC(史诗, 60, 3), LEGENDARY(传说, 100, 4); private final String displayName; private final int maxBaseValue; private final int maxAffixCount; CardRarity(String displayName, int maxBaseValue, int maxAffixCount) { this.displayName displayName; this.maxBaseValue maxBaseValue; this.maxAffixCount maxAffixCount; } public String getDisplayName() { return displayName; } public int getMaxBaseValue() { return maxBaseValue; } public int getMaxAffixCount() { return maxAffixCount; } }你可以在枚举里扩展更多字段比如颜色、图标路径、升级材料数量等。要注意的是maxBaseValue并不是最终属性的绝对值而是生成区间的上限。3.3 词缀类设计词缀是卡牌随机生成的关键。一条词缀包含属性类型、属性值、描述文本。为了避免随机出负收益词缀词缀池里只放正面效果词缀这也是一个常见的设计倾向。// 文件路径src/main/java/com/example/card/CardAffix.java package com.example.card; public class CardAffix { private String attribute; private int value; private String description; public CardAffix() { } public CardAffix(String attribute, int value, String description) { this.attribute attribute; this.value value; this.description description; } public String getAttribute() { return attribute; } public void setAttribute(String attribute) { this.attribute attribute; } public int getValue() { return value; } public void setValue(int value) { this.value value; } public String getDescription() { return description; } public void setDescription(String description) { this.description description; } Override public String toString() { return description; } }实际项目中词缀还可以补充稀有度限制、职业限制、是否互斥等约束。比如“火焰伤害”词缀不应该出现在冰霜系卡牌上这类规则我们会在生成校验中处理。3.4 加权随机算法加权随机是卡牌生成里使用频率最高的算法场景比如抽稀有度。抽前缀和后缀。抽职业。加权随机的核心思路是把每个选项的权重映射成一段区间权重越大区间越长随机数落在该区间的概率越大。// 文件路径src/main/java/com/example/card/RandomUtil.java package com.example.card; import java.util.List; import java.util.Random; public class RandomUtil { private static final Random RANDOM new Random(); public static T T weightedRandom(ListT items, ListInteger weights) { if (items null || weights null || items.isEmpty()) { throw new IllegalArgumentException(items 和 weights 不能为空); } if (items.size() ! weights.size()) { throw new IllegalArgumentException(items 和 weights 数量必须一致); } int totalWeight 0; for (int weight : weights) { if (weight 0) { throw new IllegalArgumentException(权重不能为负数); } totalWeight weight; } if (totalWeight 0) { throw new IllegalArgumentException(权重总和必须大于 0); } int randomValue RANDOM.nextInt(totalWeight); int current 0; for (int i 0; i items.size(); i) { current weights.get(i); if (randomValue current) { return items.get(i); } } return items.get(items.size() - 1); } }这段代码的核心是RANDOM.nextInt(totalWeight)。随机数范围是[0, totalWeight)然后依次累加权重找到第一个让随机数落在累计区间内的选项。这样权重为 10 的选项和权重为 30 的选项被选中的概率比就是 1 : 3。3.5 卡牌名称随机拼接卡牌名称采用“前缀 基础名 后缀”的结构例如梦想 之杖 烈焰 → “梦想之杖·烈焰”暗影 护腕 迅捷 → “暗影护腕·迅捷”前缀库、基础名库、后缀库分别存放字符串。生成时从三个池子里各取一个元素组合成完整名称。为了减少重复可以在名字池里增加更多候选词。3.6 基础属性生成基础属性与稀有度绑定。传说卡牌的基础属性上限最高普通卡牌上限最低。生成方式可以是在[最小值, 最大值]区间内随机。int baseAttack randomRange(1, rarity.getMaxBaseValue()); int baseDefense randomRange(1, rarity.getMaxBaseValue());如果游戏需要更复杂的曲线比如随着玩家等级成长可以把属性生成改成公式基础值 等级系数 * 稀有度系数 * 随机浮动。4. 完整实战案例接下来我们把上面各模块拼起来完成一个可运行的卡牌随机生成器。4.1 创建生成器类CardGenerator负责定义词缀池、名字池、稀有度池然后执行完整的卡牌生成流程。// 文件路径src/main/java/com/example/card/CardGenerator.java package com.example.card; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.UUID; public class CardGenerator { private static final ListString PREFIX_POOL Arrays.asList( 烈焰, 寒冰, 暗影, 雷霆, 神圣, 剧毒, 疾风, 大地 ); private static final ListString BASE_NAME_POOL Arrays.asList( 长剑, 法杖, 护盾, 护腕, 戒指, 战靴, 头盔, 披风 ); private static final ListString SUFFIX_POOL Arrays.asList( 之力量, 之守护, 之敏捷, 之智慧, 之生命, 之暴击, 之回复 ); private static final ListCardRarity RARITY_POOL Arrays.asList( CardRarity.COMMON, CardRarity.RARE, CardRarity.EPIC, CardRarity.LEGENDARY ); private static final ListInteger RARITY_WEIGHTS Arrays.asList(50, 30, 15, 5); private static final ListCardAffix AFFIX_POOL Arrays.asList( new CardAffix(攻击力, 5, 攻击力 5), new CardAffix(防御力, 5, 防御力 5), new CardAffix(生命值, 20, 生命值 20), new CardAffix(暴击率, 2, 暴击率 2%), new CardAffix(闪避率, 2, 闪避率 2%), new CardAffix(生命偷取, 1, 生命偷取 1%) ); private static final ListInteger AFFIX_WEIGHTS Arrays.asList(10, 10, 10, 8, 8, 5); public Card generate() { Card card new Card(); card.setId(UUID.randomUUID().toString().replace(-, ).substring(0, 8)); card.setRarity(RandomUtil.weightedRandom(RARITY_POOL, RARITY_WEIGHTS)); String prefix RandomUtil.weightedRandom(PREFIX_POOL, equalWeights(PREFIX_POOL.size())); String baseName RandomUtil.weightedRandom(BASE_NAME_POOL, equalWeights(BASE_NAME_POOL.size())); String suffix RandomUtil.weightedRandom(SUFFIX_POOL, equalWeights(SUFFIX_POOL.size())); card.setName(prefix baseName suffix); int maxBaseValue card.getRarity().getMaxBaseValue(); card.setAttack(randomRange(1, maxBaseValue)); card.setDefense(randomRange(1, maxBaseValue)); int maxAffixCount card.getRarity().getMaxAffixCount(); ListCardAffix selectedAffixes new ArrayList(); for (int i 0; i maxAffixCount; i) { CardAffix affix RandomUtil.weightedRandom(AFFIX_POOL, AFFIX_WEIGHTS); if (!selectedAffixes.contains(affix)) { selectedAffixes.add(affix); } } card.setAffixes(selectedAffixes); return card; } private ListInteger equalWeights(int size) { ListInteger weights new ArrayList(); for (int i 0; i size; i) { weights.add(1); } return weights; } private int randomRange(int min, int max) { if (min max) { throw new IllegalArgumentException(min 不能大于 max); } return min new java.util.Random().nextInt(max - min 1); } }这里有两个细节值得说明前缀、基础名、后缀池里的名字数量不一样我通过equalWeights生成了等权重列表表示每个名字被选中的概率相同。词缀去重使用了List.contains()判断。实际项目中建议在CardAffix里重写equals()和hashCode()否则contains比较的是对象引用可能导致去重失效。4.2 编写入口演示类Main类用来循环生成若干张卡牌并打印结果。// 文件路径src/main/java/com/example/card/Main.java package com.example.card; public class Main { public static void main(String[] args) { CardGenerator generator new CardGenerator(); int count 10; for (int i 0; i count; i) { Card card generator.generate(); System.out.println((i 1) . card); } } }4.3 运行与预期输出在项目根目录执行javac -encoding UTF-8 src/main/java/com/example/card/*.java java -cp src/main/java com.example.card.Main输出示例每次运行结果会不同1. Card{ida3f2c9d1, name烈焰长剑之力量, rarity史诗, professionnull, attack42, defense37, affixes[攻击力 5, 暴击率 2%, 生命偷取 1%]} 2. Card{id7e5b6a0f, name寒冰法杖之守护, rarity普通, professionnull, attack7, defense3, affixes[防御力 5]}需要注意的是当前示例没有给profession赋值所以输出为null。如果你需要职业系统可以在生成流程中增加职业池字段。4.4 结果校验生成卡牌之后需要做几项校验避免异常数据入库名称是否为空。攻击力、防御力是否为负数。稀有度和词缀数量是否匹配。是否有重复词缀。可以在generate()方法末尾增加一个validateCard()方法例如private void validateCard(Card card) { if (card.getName() null || card.getName().isEmpty()) { throw new IllegalStateException(卡牌名称不能为空); } if (card.getAttack() 0 || card.getDefense() 0) { throw new IllegalStateException(卡牌基础属性不能为负数); } if (card.getAffixes().size() card.getRarity().getMaxAffixCount()) { throw new IllegalStateException(词缀数量超出稀有度限制); } }5. 常见问题与排查思路5.1 随机结果重复率太高现象一次性生成 100 张卡牌出现大量同名或同属性卡牌。原因名字池和词缀池太小随机组合空间有限。解决思路扩大词缀池至少准备 30 条以上的词缀。增加基础属性值的随机浮动范围。对名称组合做去重。5.2 传说卡牌强度失控现象传说卡牌随机出的属性数值远超预期。原因属性区间上限设置过大或者随机时没有做收敛。解决思路属性上限不要只依赖稀有度可以结合玩家等级。对单个属性值设置范围约束。对词缀效果做叠加上限限制。5.3 词缀自相矛盾现象一张卡牌同时带有“火焰伤害 10”和“冰霜伤害 10”数值上不冲突但主题上很奇怪。原因没有配置词缀互斥规则。解决思路在词缀池中增加“互斥分组”字段。生成词缀时如果候选词缀与已选词缀处于同一互斥组则重新抽取。如果多次抽取失败可以放弃该词缀而不是无限循环。5.4 随机数工具在多线程下性能异常现象多个线程同时调用生成器随机结果出现重复序列。原因每个线程直接new Random()相同种子产生的序列可能相同或者多个线程共享同一个Random实例导致竞争。解决思路使用ThreadLocalRandom.current()替代new Random()。或者使用SecureRandom用于安全相关的随机场景《卡牌随机生成》一般用不到安全级别普通Random即可。在并发场景下不要每次都new Random()。5.5 输出的字符编码乱码现象控制台打出的中文词缀变成乱码。原因Windows 平台默认编码与文件编码不一致。解决思路编译时增加-encoding UTF-8。运行参数增加-Dfile.encodingUTF-8。5.6 常见问题速查表问题现象常见原因解决思路同名卡牌太多名称池太小增加前缀、基础名、后缀数量词缀重复词缀池配比不足实现去重逻辑并约束可叠加数量卡片属性畸形随机区间过宽设置合理的区间范围生成结果毫无意义没有规则约束加入互斥规则、主题匹配规则每次运行结果完全相同随机种子固定使用默认随机种子不要手写固定种子性能卡顿每次生成都读取数据库词缀池启动时加载词缀池到内存6. 最佳实践与工程建议6.1 把词缀池外置到配置或数据库示例代码为了演示方便把词缀池直接写死在代码里。真实项目建议把词缀池放到数据库表或者 JSON 配置文件里这样策划或运营可以不用改代码只调整数据就可以扩展卡牌内容。例如可以设计一张card_affix_pool表字段类型说明affix_idvarchar词缀 IDattributevarchar属性类型valueint数值descriptionvarchar描述weightint抽取权重conflict_groupvarchar互斥分组这样后续做版本更新时只需发布新的配置文件或数据库记录不需要上线新的服务代码。6.2 分离随机与业务逻辑随机生成是纯函数逻辑不应该依赖 HTTP 请求、数据库连接等外部状态。建议把生成器设计成无状态服务词缀池通过构造函数传入这样方便单元测试。public CardGenerator(ListCardAffix affixPool) { this.affixPool affixPool; }6.3 使用种子随机便于复现问题测试过程中如果发现某张卡牌数值异常最好能复现这条生成路径。一种做法是支持传入long seedpublic Card generate(long seed) { Random random new Random(seed); // 使用 random 替换全局 RandomUtil }这样玩家反馈一张卡牌有问题时我们可以用同一种子重新生成快速定位问题。6.4 生成后必须做校验随机生成最容易出现的问题是“生成了不代表合法”。建议在落库之前强制调用校验逻辑校验不通过则重新生成。为了避免死循环可以限制重试次数比如同一个生成器最多尝试 5 次。6.5 记录生成日志线上环境建议记录以下信息生成请求的唯一 ID。卡牌名称、稀有度、属性。使用的随机种子。生成时间。客户端版本或服务端版本。这样后续做数据分析和问题回溯都会方便得多。6.6 注意版本兼容随机生成的规则会随着游戏版本更新而变化。如果玩家已经拥有旧版本生成的卡牌新版本上线后不能直接删除或重算否则会让玩家感到不公。建议在卡牌实体上增加version字段用于标识这张卡牌是哪个生成规则产出的。6.7 性能层面的建议如果一次要生成大量卡牌比如活动奖励发 1 万张建议批处理时使用独立的Random实例。避免每张卡牌都重新查询配置。使用 StringBuilder 拼接描述文本。生成完成后统一批量写数据库减少连接消耗。6.8 安全与权限注意事项虽然卡牌随机生成本身不涉及高危险操作但如果生成系统接入了奖励发放、数据库写入等能力务必注意权限控制。线上生产环境执行批量生成前先在小范围测试环境验证数据变更前备份数据库防止误操作把大量异常卡牌写入线上。6.9 迭代方向卡牌随机生成可以继续扩展的方向非常多比如关联技能系统、加入卡牌组合羁绊、根据玩家等级动态调整词缀池、引入机器学习生成词缀组合等。但无论怎么扩展核心还是“规则约束 加权随机 可配置数据源”这三板斧。7. 总结与学习路线到这里一套完整的卡牌随机生成方案已经落地了从卡牌数据结构设计、加权随机算法、名称拼接到完整的 Java 生成器实现和环境运行演示都有覆盖。你可以直接复制代码跑出第一批随机卡牌也可以在此基础上把词缀池改成配置文件把生成器接进自己的游戏服务端。如果继续深入建议重点研究以下方向学习ThreadLocalRandom、SecureRandom、随机种子等 Java 随机数知识。研究更复杂的抽取算法比如保底机制、伪随机分布。把随机生成场景扩展到装备、任务、地图等更广的领域。如果项目规模变大可以尝试将生成规则DSL化用更灵活的方式描述卡牌生成逻辑。最后给你一个实操建议先跑通本文的 Java 示例然后把词缀池改成 50 条以上再批量生成 1000 张卡牌统计每种稀有度的实际占比是否符合你的权重设置。这个过程能帮你真正理解加权随机和规则约束的价值也能让你在后续接入真实项目时少踩很多坑。如果这篇文章对你有帮助欢迎收藏备用。下一期可以聊一聊“随机装备属性平衡”或者“卡牌组合评分系统”相信同样会让你有收获。

相关新闻

ok-ww 完整鸣潮后台自动化指南:从环境自检到一键日常

ok-ww 完整鸣潮后台自动化指南:从环境自检到一键日常

ok-ww 完整鸣潮后台自动化指南:从环境自检到一键日常 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves ok-ww 是一款鸣潮…

2026/10/16 6:48:57 阅读更多 →
Kafka集群高可用全解析:副本、ISR、选举与运维实践

Kafka集群高可用全解析:副本、ISR、选举与运维实践

Kafka集群高可用这件事,很多人的理解停留在“多副本”三个字上。但真正把集群丢到生产环境,面对机房断电、节点宕机、磁盘损坏、网络抖动这些场景,你才会发现高可用是一整套机制在协同工作:副本怎么同步、ISR怎么收缩、Leader怎么…

2026/10/16 6:48:57 阅读更多 →
MooTool Next Compose 如何对齐 Electron 版:基于 DIFF 切片台账的 Parity Gap 追踪与验收实践

MooTool Next Compose 如何对齐 Electron 版:基于 DIFF 切片台账的 Parity Gap 追踪与验收实践

桌面应用开发工具 【免费下载链接】MooTool Handy tool set for developers 项目地址: https://gitcode.com/gh_mirrors/mo/MooTool 点击查看 免费下载 本文基于仓库中的 parity gap 台账 results.md,讲解 MooTool Next Compose(Compose Mul…

2026/10/16 6:48:57 阅读更多 →

最新新闻

airllm分层加载实战:8GB显存跑70B大模型推理

airllm分层加载实战:8GB显存跑70B大模型推理

1. 当大模型装不进显卡时,我在想什么第一次看到 airllm 这个项目名的时候,我正对着自己那台只有 8GB 显存的旧笔记本发愁。想跑一个 70B 参数级别的大语言模型,按常规思路算一下显存占用:光是模型权重以 FP16 精度加载&#xff0c…

2026/10/16 7:34:10 阅读更多 →
宏组学关联分析新利器MaAsLin3:两部件回归与稳健估计

宏组学关联分析新利器MaAsLin3:两部件回归与稳健估计

Nature Methods上那篇MaAsLin3的论文,在宏组学关联分析这个领域里算是个不大不小的里程碑。这几年做微生物组、代谢组与宿主表型关联研究的人,对MaAsLin系列应该都不陌生:它用多变量线性模型,把物种丰度、通路丰度或者代谢物丰度矩…

2026/10/16 7:34:10 阅读更多 →
图的四种存储结构本质:从邻接矩阵到邻接多重表的技术演进

图的四种存储结构本质:从邻接矩阵到邻接多重表的技术演进

1. 这份笔记不是“背了就能考高分”的速成口诀,而是帮你真正看懂图结构的底层逻辑“数据结构考研笔记(十五)——图的存储结构邻接矩阵、邻接表、十字链表、临界多重表的概念”,光看标题,很多人第一反应是:又…

2026/10/16 7:34:10 阅读更多 →
综合能源系统P2G与碳捕集耦合的epsilon约束法优化复现

综合能源系统P2G与碳捕集耦合的epsilon约束法优化复现

说句实在话,看到标题里带“SCI一区复现”的时候,我第一反应是又双叒叕一篇综合能源系统运行优化。但真把这篇Energy期刊的文章拆开读完之后,我发现它跟很多“挂羊头卖狗肉”的IES文章不一样:一是它把P2G和碳捕集设备做成了物理耦合…

2026/10/16 7:34:10 阅读更多 →
图的四种存储结构选型:邻接矩阵、邻接表、十字链表与邻接多重表深度对比

图的四种存储结构选型:邻接矩阵、邻接表、十字链表与邻接多重表深度对比

1. 为什么图的四种存储结构不能只背定义?——从一道真题切入去年某高校考研真题里有这么一道题:给定一个含100个顶点、稀疏分布的有向图,要求支持高频的“查询某条边是否存在”和“遍历所有出边”操作,请分析邻接矩阵、邻接表、十…

2026/10/16 7:34:10 阅读更多 →
具身智能入门与落地:从数据闭环到系统化工程实践

具身智能入门与落地:从数据闭环到系统化工程实践

这些天 AI 圈子最热闹的话题,莫过于 GPT-6 Astra。各群从白天讨论到深夜,先聊模型,后聊机器人,最后一定会落到具身智能。我第一反应不是去搜测试视频,而是想起这个月已经有三四个朋友跑来问我:“具身智能到…

2026/10/16 7:33:10 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →