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):- 先将32位无符号整数最大值转为64位浮点数,乘以预设中奖概率得到中奖阈值
- 将阈值转换回32位无符号整数类型
- 对比本次摇点结果和阈值:摇点结果小于等于阈值则返回
true(中奖),否则返回false(未中奖)
举个实际例子方便理解:如果合约预设中奖率为10%(即this.chance = 0.1),那么计算得到的中奖阈值约为429496730,只要随机摇出的数字落在1~429496730这个区间内就算中奖,区间占总随机数范围的比例刚好和预设中奖概率一致,保证了抽奖逻辑的公平性。
内容的提问来源于stack exchange,提问作者Ozan İşgör
相关产品推荐
相关产品推荐

