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

NCD.L1.sample--lottery合约play方法运行原理及中奖逻辑问询

彩票合约play方法运行机制详解

该方法是NCD.L1.sample--lottery合约的核心抽奖逻辑,调用后会返回布尔值标识本次参与是否中奖,逐行运行逻辑如下:

play(): bool {
    const rng = new RNG<u32>(1, u32.MAX_VALUE);
    const roll = rng.next();
    logging.log("roll: " + roll.toString());
    return roll <= <u32>(<f64>u32.MAX_VALUE * this.chance);
}
  • 第1行play(): bool:方法声明,返回值为布尔类型,true代表中奖,false代表未中奖。
  • 第2行const rng = new RNG<u32>(1, u32.MAX_VALUE);:实例化32位无符号整数类型的随机数生成器,约定生成的随机数范围为闭区间[1, 4294967295](u32.MAX_VALUE是32位无符号整数的最大值,固定为4294967295)。
  • 第3行const roll = rng.next();:调用随机数生成器的next方法,获取一个符合上述范围要求的随机数,作为本次抽奖的摇点结果。
  • 第4行logging.log("roll: " + roll.toString());:将本次摇点结果记录到链上日志中,方便后续公开核验抽奖结果。
  • 第5行return roll <= <u32>(<f64>u32.MAX_VALUE * this.chance);:核心中奖判断逻辑,其中this.chance是合约预设的中奖概率参数(比如1%中奖率对应值为0.01):
    1. 先将32位无符号整数最大值转为64位浮点数,乘以预设中奖概率得到中奖阈值
    2. 将阈值转换回32位无符号整数类型
    3. 对比本次摇点结果和阈值:摇点结果小于等于阈值则返回true(中奖),否则返回false(未中奖)

举个实际例子方便理解:如果合约预设中奖率为10%(即this.chance = 0.1),那么计算得到的中奖阈值约为429496730,只要随机摇出的数字落在1~429496730这个区间内就算中奖,区间占总随机数范围的比例刚好和预设中奖概率一致,保证了抽奖逻辑的公平性。

内容的提问来源于stack exchange,提问作者Ozan İşgör

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:45:03