App Inventor 2 随机数与概率游戏教程

覆盖:随机整数、小数、概率抽奖、抽卡算法、权重随机、伪随机种子。

一、随机数基础

1.1 基础随机数

// 随机整数 [min, max]
初始化局部变量 随机整数 = 随机整数(1, 100)

// 随机小数 [0, 1)
初始化局部变量 随机小数 = 随机小数

// 随机小数 [0, max]
初始化局部变量 随机范围 = 随机整数(0, 1000) / 1000

1.2 随机列表项

// 从列表随机选择一项
定义 随机取项(列表)
  初始化局部变量 索引 = 随机整数(1, 列表长度(列表))
  返回 选择列表项(列表, 索引)

// 使用
初始化局部变量 奖品列表 = ["一等奖", "二等奖", "三等奖", "谢谢参与"]
初始化局部变量 结果 = 调用 随机取项(奖品列表)

二、概率抽奖算法

2.1 固定概率抽奖

// 一等奖 1% / 二等奖 5% / 三等奖 10% / 谢谢参与 84%

定义 概率抽奖()
  初始化局部变量 随机值 = 随机整数(1, 100)
  
  如果 随机值 <= 1 则
    返回 "一等奖"
  否则如果 随机值 <= 6 则    // 1+5
    返回 "二等奖"
  否则如果 随机值 <= 16 则    // 6+10
    返回 "三等奖"
  否则
    返回 "谢谢参与"

// 使用
当 按钮_抽奖.被点击 时
  初始化局部变量 结果 = 调用 概率抽奖()
  调用 对话框1.显示消息对话框("你抽中了:" + 结果, "抽奖结果", "确定")

2.2 权重随机(更灵活)

// 权重池:奖品 -> 权重
初始化全局变量 奖品权重 = 创建字典(
  键值对("SSR", 1),      // 1%
  键值理("SR", 5),       // 5%
  键值对("R", 20),      // 20%
  键值对("N", 74)       // 74%
)

// 权重随机算法
定义 权重随机(权重池)
  初始化局部变量 总权重 = 0
  对于 每个 权重 在 获取值列表(权重池) 中
    设置 总权重 = 总权重 + 权重
  
  初始化局部变量 随机值 = 随机整数(1, 总权重)
  初始化局部变量 累计 = 0
  
  对于 每个 奖品 在 获取键列表(权重池) 中
    设置 累计 = 累计 + 获取键的值(权重池, 奖品, 0)
    如果 随机值 <= 累计 则
      返回 奖品
  
  返回 获取键列表(权重池)[列表长度(获取键列表(权重池))]

// 使用
当 按钮_抽卡.被点击 时
  初始化局部变量 结果 = 调用 权重随机(全局变量 奖品权重)
  调用 对话框1.显示消息对话框("你抽到了:" + 结果, "抽卡结果", "确定")

三、保底机制

3.1 井号机制

// 每100抽必中SSR

初始化全局变量 保底计数器 = 0
初始化全局变量 保底阈值 = 100

定义 保底抽奖()
  设置 全局变量 保底计数器 = 全局变量 保底计数器 + 1
  
  初始化局部变量 随机值 = 随机整数(1, 1000)    // 0.1% = 1/1000
  
  // 保底判断
  如果 全局变量 保底计数器 >= 全局变量 保底阈值 则
    设置 全局变量 保底计数器 = 0
    返回 "SSR(保底)"
  
  // 正常概率
  如果 随机值 = 1 则
    设置 全局变量 保底计数器 = 0
    返回 "SSR"
  否则如果 随机值 <= 11 则    // 1%
    返回 "SR"
  否则如果 随机值 <= 61 则    // 5%
    返回 "R"
  否则
    返回 "N"

四、伪随机与真随机

4.1 固定种子(可复现)

某些场景需要可复现的随机序列:
// App Inventor 2 原生不支持种子
// 使用扩展或自定义算法

// 线性同余生成器(LCG)
定义 伪随机数种子(种子)
  初始化全局变量 当前种子 = 种子

定义 伪随机数()
  // LCG公式: X(n+1) = (a*X(n) + c) % m
  设置 全局变量 当前种子 = 余数(16807 * 全局变量 当前种子, 2147483647)
  返回 商(全局变量 当前种子, 2)

// 使用
当 按钮_开始.被点击 时
  调用 伪随机数种子(12345)    // 固定种子,每次产生相同序列
  
  对于 i 从 1 到 10 步长 1
    初始化局部变量 值 = 调用 伪随机数() / 1000000
    设置 标签_结果.文本 = 合并字符串(标签_结果.文本, 值, "\n")

五、实战:幸运大转盘

5.1 界面

垂直布局
├── 画布1(转盘图片)
├── 按钮_抽奖(开始抽奖)
└── 标签_结果

5.2 代码

初始化全局变量 奖项列表 = ["一等奖", "二等奖", "三等奖", "四等奖", "五等奖", "谢谢参与"]
初始化全局变量 奖项角度 = 创建列表(0, 60, 120, 180, 240, 300)    // 每个奖项占60度

定义 转盘抽奖()
  初始化局部变量 随机索引 = 随机整数(0, 5)
  初始化局部变量 奖项 = 选择列表项(全局变量 奖项列表, 随机索引 + 1)
  初始化局部变量 目标角度 = 选择列表项(全局变量 奖项角度, 随机索引 + 1)
  
  // 动画旋转3圈 + 目标角度
  初始化局部变量 总角度 = 1080 + 目标角度    // 3圈 = 1080度
  
  // 旋转动画
  当 计时器_转盘.计时 时
    设置 画布1.旋转角度 = 计时器_转盘.当前角度
    如果 计时器_转盘.当前角度 >= 总角度 则
      设置 计时器_转盘.启用计时 = 假
      调用 对话框1.显示消息对话框("恭喜获得:" + 奖项, "抽奖结果", "确定")

当 按钮_抽奖.被点击 时
  设置 计时器_转盘.启用计时 = 真

六、常见问题

Q1:随机数不均匀?

确保使用足够大的范围,如 1-1000 而非 1-10

Q2:如何实现概率累计?

使用权重池,逐个累加比较

Q3:保底如何实现?

计数器+重置逻辑,详细见上文
文档版本:2026.03 | 作者:App Inventor 2 中文网 www.fun123.cn

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:
  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。