Node.js Random Generator按指定权重随机生成不同种族艺术图层问题咨询
随机权重种族生成逻辑调整方案
1. 基础配置调整
首先定义带权重的种族配置项,替换你原有的纯种族列表配置:
// 示例配置,可根据实际需求扩展种族、调整权重、绑定对应种族的图层 const RACE_CONFIG = [ { name: "种族1", weight: 70, // 权重占比,数值越大选中概率越高 layerSet: [/* 该种族对应的所有图层配置,和你原来的单种族图层配置逻辑一致 */] }, { name: "种族2", weight: 30, layerSet: [/* 种族2对应的图层配置 */] } ] const TOTAL_SUPPLY = 1000 // 你要生成的作品总数量
2. 实现权重随机选择种族工具函数
const getRandomRace = () => { // 计算总权重 const totalWeight = RACE_CONFIG.reduce((sum, race) => sum + race.weight, 0) // 生成0到总权重之间的随机数 const random = Math.random() * totalWeight let currentWeight = 0 // 遍历匹配命中的种族 for (const race of RACE_CONFIG) { currentWeight += race.weight if (random < currentWeight) { return race } } }
如果需要严格100%匹配预设权重占比(比如总产1000份必须正好700份种族1、300份种族2),可以用预生成种族池的方案替代上面的实时随机函数:
// 预生成按权重占比分配的种族池,再打乱顺序 const generateRacePool = () => { const pool = [] RACE_CONFIG.forEach(race => { // 计算该种族实际生成数量,四舍五入或取整规则可自行调整 const count = Math.round(TOTAL_SUPPLY * (race.weight / RACE_CONFIG.reduce((sum, r) => sum + r.weight, 0))) pool.push(...Array(count).fill(race)) }) // 打乱种族池顺序,实现随机切换种族生成 return pool.sort(() => Math.random() - 0.5) } const racePool = generateRacePool()
3. 替换原有生成循环逻辑
删除你原来的「先遍历种族,再按种族生成固定数量」的嵌套循环,替换为以下逻辑:
// 用实时随机权重的方案走这个循环 const createAllNFTs = async () => { for (let i = 0; i < TOTAL_SUPPLY; i++) { // 每次生成前先随机选种族 const currentRace = getRandomRace() // 沿用你原来的单种族生成逻辑,传入当前种族对应的图层配置currentRace.layerSet生成作品即可 // 原有去重、元数据生成、图片导出逻辑无需修改 } } // 用预生成种族池的精准占比方案走这个循环 const createAllNFTsByPool = async () => { for (let i = 0; i < racePool.length; i++) { const currentRace = racePool[i] // 同上,沿用原有生成逻辑,传入currentRace.layerSet即可 } }
注:原有图层拼接、去重校验、元数据输出、图片保存的逻辑无需调整,仅替换种族选择和循环逻辑即可实现需求。
内容的提问来源于stack exchange,提问作者Gian Franco De La Mendoza
相关产品推荐
相关产品推荐

